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

Lin*_*gxi 8 c++ enable-if template-meta-programming variadic-templates c++11

以下代码无法编译,我只是无法弄清楚原因.

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

产生的错误消息是:

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

101*_*010 14

您需要括号才能由编译器正确解析:

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

  • 请你给个解释好吗? (2认同)

Lor*_*ins 10

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

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

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

Demo