作为表达式的模板参数语法
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 < 0
是 std::enable_if 的模板参数(类型为 bool
),std::enable_if<(n < 0)>::type
是 std::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.
有谁知道以下代码如何用于 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 < 0
是 std::enable_if 的模板参数(类型为 bool
),std::enable_if<(n < 0)>::type
是 std::enable_if
内部定义的成员 typedef
(仅存在于n < 0
为真)。
template< bool B, class T = void >
struct enable_if;
If
B
istrue
,std::enable_if
has a public member typedef type, equal toT
; 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.