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)
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)