C++ 从enable#u if'继承;d基地
我试图对非字符数组的一个特性进行部分专门化:C++ 从enable#u if'继承;d基地,c++,templates,sfinae,template-meta-programming,enable-if,C++,Templates,Sfinae,Template Meta Programming,Enable If,我试图对非字符数组的一个特性进行部分专门化: template<typename T> struct is_container : std::false_type {}; template<typename T, unsigned N> struct is_container<T[N]> : std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};
template<typename T>
struct is_container : std::false_type {};
template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};
但我真的很想知道为什么SFINAE在这种特殊情况下不起作用。查看下面的主题“3.1启用模板类专门化” 编辑:万一boost.org链接死了 3.1启用模板类专门化 如果需要,可以使用enable_启用或禁用类模板专门化。需要为启用码表达式添加一个额外的模板参数。此参数具有默认值void。例如:
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };
模板
A类{…};
模板
A类{…};
模板
A类{…};
使用任何整数类型实例化一个实例与第一个专门化匹配,而任何浮点类型与第二个专门化匹配。所有其他类型都与主模板匹配。条件可以是依赖于类的模板参数的任何编译时布尔表达式。请再次注意,启用_if的第二个参数是不需要的;默认值(void)是正确的值。好吧,我认为
typename
前面需要std::enable\u if
,因为依赖类型,但我不会把它作为答案,因为这只是猜测@阿拉克:不需要。typename
在该上下文中不是必需的。在搜索基类时,编译器会在开始时排除所有非类型。请参见:您能否指定您正在尝试执行的操作,例如,您正在尝试实例化is_container
的什么上下文,以便您期望SFINAE启动?另一方面,如果你只需要一个有条件的基础,像std::conditional
这样的东西会更合适。这可能是一个硬错误的问题,你是否尝试过boost::lazy\u enable\u if
?我非常怀疑boost.org的链接会消失,但无论如何我会发布一个完整的答案。我也是,尽管他们过去已经重新组织过他们的站点:)请注意,boost::is_float
与std::is_float_point
非常相似。
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };