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

Using sizeof... within std::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() {
                                         ^

你需要括号才能让编译器正确解析:

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

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

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

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

Demo