有没有人知道以下代码如何用于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 ++标题中定义的还是已经在标准中了?如果是这样,将表达式作为被调用的对象处理的技术是什么?如何阅读更多关于此的内容?
非常感谢。
答案 0 :(得分:2)
这看起来像编译器隐式地将表达式(n&lt; 0)转换为对象
没有。 git gc
是std::enable_if的模板参数(类型n < 0
),bool
是std::enable_if<(n < 0)>::type
内定义的成员typedef
(仅在std::enable_if
时存在) n < 0
是真的。)
template< bool B, class T = void >
struct enable_if;
如果
B
为true
,则std::enable_if
具有公共成员typedef类型,相等 到T
;否则,没有成员typedef。此元功能是利用SFINAE的便捷方式 有条件地从基于类型的重载决策中删除函数 特征和提供单独的函数重载和特化 对于不同类型的特征。
std::enable_if
可以作为附加内容使用 函数参数(不适用于运算符重载),作为返回 type(不适用于构造函数和析构函数),或作为类 模板或函数模板参数。