[英]Can I get rid of template specialisation with std::enable_if?
我读到了std::enable_if
:
基于类型的任意属性的函数重载
所以我试图通过enable_if
(如下所示)重载类ctors但是我得到错误,说当使用std::enable_if
时, enable_if
不能用于禁用声明和这两行:
#include <iostream>
#include <type_traits>
#include <typeinfo>
template <typename T>
class cls
{
public:
cls (T a, typename std::enable_if< std::is_same<T, int>::value >::type * Dummy = 0)
{
std::cout << "Ctor for int\n";
}
cls (T a, typename std::enable_if< std::is_same<T, char>::value >::type * Dummy = 0)
{
std::cout << "Ctor for char\n";
}
};
int main()
{
cls a(10);
cls b('x');
return 0;
}
因此可以使用enbale_if
重载enbale_if
。
问题是,例如,当您实例化cls<int>
,您将始终从第二个构造函数overloaing获得失败的需求,即std::enable_if< std::is_same<T, char>::value >::type
T
是int
。 cls<char>
。
您可以制作构造函数模板以使SFINAE生效; 这将从重载集中删除模板特化,并且不会导致编译错误。 例如
template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, int>::value >::type * Dummy = 0)
{
std::cout << "Ctor for int\n";
}
template <typename X = T>
cls (X a, typename std::enable_if< std::is_same<X, char>::value >::type * Dummy = 0)
{
std::cout << "Ctor for char\n";
}
你似乎不需要这里的enable_if
,只是一个常规的构造函数:
cls(T a) { std::cout << "Ctor for T\n"; }
要禁用模板类专门化,请不要提供其定义:
template<> class cls<void>; // disabled specialization.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.