从enable_if'd基继承

发布于 2024-12-04 07:23:43 字数 763 浏览 3 评论 0原文

我试图部分专门化非字符数组的特征:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦魇绽荼蘼 2024-12-11 07:23:43

检查主题“3.1 启用模板类专业化”:
http://www.boost.org/doc/libs/1_47_0 /libs/utility/enable_if.html

编辑:以防 boost.org 链接失效...

3.1 启用模板类专业化
可以使用enable_if启用或禁用类模板特化。需要为启用器表达式添加一个额外的模板参数。该参数的默认值是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 都匹配第一个特化,而任何浮点类型则匹配第二个特化。所有其他类型都与主模板匹配。条件可以是任何依赖于类的模板参数的编译时布尔表达式。再次注意,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:

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文