作为表达式的模板参数语法

Template Argument syntax as an expression

有谁知道以下代码如何用于 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) 转换为 object。

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

非常感谢。

this looks like the compiler is implicitly converting the expression (n < 0) into an object

没有。 n < 0std::enable_if 的模板参数(类型为 bool),std::enable_if<(n < 0)>::typestd::enable_if 内部定义的成员 typedef(仅存在于n < 0 为真)。

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

If B is true, std::enable_if has a public member typedef type, equal to T; otherwise, there is no member typedef.

This metafunction is a convenient way to leverage SFINAE to conditionally remove functions from overload resolution based on type traits and to provide separate function overloads and specializations for different type traits. std::enable_if can be used as an additional function argument (not applicable to operator overloads), as a return type (not applicable to constructors and destructors), or as a class template or function template parameter.