Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从enable#u if'继承;d基地_C++_Templates_Sfinae_Template Meta Programming_Enable If - Fatal编程技术网

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> { ... };