在 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
以下代码无法编译,我就是想不通为什么。
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