【发布时间】:2018-03-26 18:23:09
【问题描述】:
这是我最好的尝试:
#include <iostream>
template <bool EnableSomething = false>
class MyClass
{
typename std::enable_if< EnableSomething >::type
something(int& x)
{
x += 1; //do something
}
typename std::enable_if< !EnableSomething >::type
something(int& x)
{
// do nothing, should be optimized away
}
public:
void Process()
{
int x = 0;
something(x);
std::cout << "Enabled: " << EnableSomething << ". x = " << x << std::endl;
}
};
int main()
{
MyClass<true> yes;
MyClass<false> no;
yes.Process();
no.Process();
return 0;
}
编译器说:
tester.cpp(12): error C2039: 'type': is not a member of 'std::enable_if<false,_Ty>'
【问题讨论】:
-
这对于
if constexpr来说似乎是一个很好的例子,但是在c++ 11 中你需要编写常规的成员函数模板。 -
首先,确保包含
type_traits。其次,不能根据返回类型重载。 -
这是根本错误的。 SFINAE 基于论据推导和替换,因此“失败不是错误”。这里根本不扣分。
-
这不应该被标记为重复,从@VT_T 的回答中可以看出一点不同的问题。