在代码中:
template<class T>
struct is_builtin
{
enum {value = 0};
};
template<>
struct is_builtin<char>
{
enum {value = 1};
};
template<>
struct is_builtin<int>
{
enum {value = 1};
};
template<>
struct is_builtin<double>
{
enum {value = 1};
};
template<class T>
struct My
{
typename enable_if<is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Built-in as a param.\n";
}
typename enable_if<!is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Non - built-in as a param.\n";
}
};
struct A
{
};
int main()
{
A a;
My<int> m;
My<A> ma;
m.f(1);
ma.f(a);
return 0;
}
我收到一个错误:
error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
显然我不懂如何使用 enable_if
。我在想的是我可以在编译期间从一组成员函数中启用一个或第二个成员函数,但它不起作用。任何人都可以向我解释如何正确地做到这一点?
编辑
我真的无法理解的是为什么不存在 typedef
在其中一个def。编译器找不到它,它不会编译它。
您不能使用类模板参数来获取成员函数的SFINAE。
你要么需要
您不能使用类模板参数来获取成员函数的SFINAE。
你要么需要
您可以使用修改后的enable_if修复代码
template < typename T >
struct __Conflict {};
template <bool B, class T = void>
struct __enable_if { typedef __Conflict<T> type; };
template <class T>
struct __enable_if<true, T> { typedef T type; };
用法示例:
template <typename T>
class Lazy
{
public:
void _ctor(bool b);
void _ctor(typename __enable_if<!std::is_same<T, bool>::value, T>::type);
};
template <typename T>
void Lazy<T>::_ctor(bool b)
{
std::cout << "bool " << b << std::endl;
};
template <typename T>
void Lazy<T>::_ctor(typename __enable_if<!std::is_same<T, bool>::value, T>::type t)
{
std::cout << "T " << t << std::endl;
};
int main(int argc, char **argv)
{
Lazy<int> i;
i._ctor(10);
i._ctor(true);
Lazy<bool> b;
b._ctor(true);
return 0;
}
这是它的工作原理(请注意,为方便起见,我更换了你的 is_builtin
特质与 std::is_arithmetic
并使用了更多的C ++ 11东西,但它可以工作):
template<class T>
struct My
{
template<typename T_ = T, std::enable_if_t<std::is_arithmetic<T_>::value>* = nullptr>
void f(T_ arg)
{
std::cout << "Built-in as a param.\n";
}
template<typename T_ = T, std::enable_if_t<!std::is_arithmetic<T_>::value>* = nullptr>
void f(T_ arg)
{
std::cout << "Non - built-in as a param.\n";
}
};
DEMO
关键部分是将模板参数带入 直接背景 通过使用默认的函数模板参数 T_
等于类模板参数 T
。有关详细信息,请参阅 这个问题。
enable_if需要一个元函数。要使用bool,您需要enable_if_c。我很惊讶你没有得到解释这个问题的错误。
你可以通过在其中声明一个'type'typedef来修复你的元函数。然后你可以使用 boost::enable_if<is_builtin<T>>::type