在std :: enable_if中使用sizeof ...

时间:2016-01-21 11:16:19

标签: c++ c++11 variadic-templates template-meta-programming enable-if

以下代码无法编译,我无法弄清楚原因。

template <class T, class... Ts>
typename std::enable_if<sizeof...(Ts) > 0>::type func() {
  // nop
}

产生的错误信息是:

error: expected unqualified-id before numeric constant
 typename std::enable_if<sizeof...(Ts) > 0u>::type func() {
                                         ^

2 个答案:

答案 0 :(得分:13)

编译器需要正确解析这个括号:

template <class T, class... Ts>
typename std::enable_if<(sizeof...(Ts) > 0)>::type func() {
                        ^                 ^
  // nop
}

答案 1 :(得分:10)

编译器将右尖括号(>)解释为std::enable_if的右括号。这是因为一旦你开始一个模板参数(或参数)列表,第一次,编译器,有机会关闭它(使用>),它就会这样做。

解决方案(证明了上述观点):不要关闭参数列表,反转条件并使用左尖括号:

template <class T, class... Ts>
typename std::enable_if< 0 < sizeof...(Ts) >::type func() {}
//                         ^ compilers are cool with this

Demo