模板参数语法作为表达式

时间:2016-01-18 13:45:21

标签: c++ templates object expression sfinae

有没有人知道以下代码如何用于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 < 0)>::type*对我没有意义,因为这看起来像编译器隐式将表达式(n < 0)转换为对象。

我也看到过这种将表达式视为其他一些SFINAE例子中的对象的风格,但这里发生的事情就是让我不知所措。对象是在某个c ++标题中定义的还是已经在标准中了?如果是这样,将表达式作为被调用的对象处理的技术是什么?如何阅读更多关于此的内容?

非常感谢。

1 个答案:

答案 0 :(得分:2)

  

这看起来像编译器隐式地将表达式(n&lt; 0)转换为对象

没有。 git gcstd::enable_if的模板参数(类型n < 0),boolstd::enable_if<(n < 0)>::type内定义的成员typedef(仅在std::enable_if时存在) n < 0是真的。)

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

如果Btrue,则std::enable_if具有公共成员typedef类型,相等   到T;否则,没有成员typedef。

     

此元功能是利用SFINAE的便捷方式   有条件地从基于类型的重载决策中删除函数   特征和提供单独的函数重载和特化   对于不同类型的特征。 std::enable_if可以作为附加内容使用   函数参数(不适用于运算符重载),作为返回   type(不适用于构造函数和析构函数),或作为类   模板或函数模板参数。