从enable_if'd基继承
我试图部分专门化非字符数组的特征:
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 {};
Visual Studio 2010 给我一个 C2039(type
不是 enable_if
的元素...)。然而,SFINAE 不应该只是在这里触底而不是给出编译器错误吗?或者 SFINAE 不适用于这种情况?
当然,我可以将非字符和字符的专业化分开:
template<typename T>
struct is_container : std::false_type {};
template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};
template<unsigned N>
struct is_container<char[N]> : std::false_type {};
但我真的很想知道为什么 SFINAE 在这种特殊情况下不起作用。
I'm trying to partially specialize a trait for arrays of non-chars:
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 {};
Visual Studio 2010 gives me a C2039 (type
is no element of enable_if
...). However, shouldn't SFINAE just bottom out here instead of giving a compiler error? Or does SFINAE not apply in this case?
Of course I could just separate the specializations for non-char and char:
template<typename T>
struct is_container : std::false_type {};
template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};
template<unsigned N>
struct is_container<char[N]> : std::false_type {};
But I would really like to know why SFINAE doesn't work in this particular case.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
检查主题“3.1 启用模板类专业化”:
http://www.boost.org/doc/libs/1_47_0 /libs/utility/enable_if.html
编辑:以防 boost.org 链接失效...
3.1 启用模板类专业化
可以使用enable_if启用或禁用类模板特化。需要为启用器表达式添加一个额外的模板参数。该参数的默认值是void。例如:
使用任何整型类型实例化 A 都匹配第一个特化,而任何浮点类型则匹配第二个特化。所有其他类型都与主模板匹配。条件可以是任何依赖于类的模板参数的编译时布尔表达式。再次注意,enable_if 的第二个参数不是必需的;默认值 (void) 是正确的值。
Check the topic '3.1 Enabling template class specializations' at
http://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html
Edit: in case boost.org link dies...
3.1 Enabling template class specializations
Class template specializations can be enabled or disabled with enable_if. One extra template parameter needs to be added for the enabler expressions. This parameter has the default value void. For example:
Instantiating A with any integral type matches the first specialization, whereas any floating point type matches the second one. All other types match the primary template. The condition can be any compile-time boolean expression that depends on the template arguments of the class. Note that again, the second argument to enable_if is not needed; the default (void) is the correct value.