【问题标题】:Template Argument syntax as an expression作为表达式的模板参数语法
【发布时间】:2016-01-18 13:45:20
【问题描述】:

有谁知道下面的代码如何作用于 enable_if 的模板参数?

template <int n> void f(typename std::enable_if<(n < 0)>::type* = 0) {
/* ... n is negative ... */
}
template <int n> void f(typename std::enable_if<(n >= 0)>::type* = 0) {
/* ... n is positive ... */
}

特别是这部分(n &lt; 0)&gt;::type*,这对我来说没有意义,因为这看起来编译器正在隐式地将表达式(n &lt; 0) 转换为一个对象。

我在其他一些 SFINAE 示例中也看到了这种将表达式视为对象的风格,但这里发生的事情让我无法理解。该对象是在某个 c++ 标头中定义的还是已经在标准中?如果是这样,这种将表达式视为对象的技术是什么?我该如何阅读更多相关信息?

非常感谢。

【问题讨论】:

    标签: c++ templates object expression sfinae


    【解决方案1】:

    看起来编译器正在将表达式 (n

    没有。 n &lt; 0std::enable_if 的模板参数(类型为bool),std::enable_if&lt;(n &lt; 0)&gt;::type 是在std::enable_if 中定义的成员typedef(仅当n &lt; 0 为真时才存在)。

    template< bool B, class T = void >
    struct enable_if;
    

    如果Btruestd::enable_if有一个公共成员typedef类型,等于 给T;否则,没有成员 typedef。

    这个元函数是一种利用SFINAE 的便捷方式 根据类型有条件地从重载决议中删除函数 特征并提供单独的函数重载和特化 对于不同的类型特征。 std::enable_if 可以作为附加 函数参数(不适用于运算符重载),作为返回 类型(不适用于构造函数和析构函数),或作为类 模板或函数模板参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-18
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多