静态成员初始化和可变参数模板

sky*_*ack 1 c++ templates static-members static-initialization c++11

通过查看以下代码,我们注意到初始化名为的静态数据成员非常容易cnt:

template<typename T> struct Base { static int cnt; };
template<typename T> int Base<T>::cnt = 0;
int main() { }
Run Code Online (Sandbox Code Playgroud)

无论如何,我正在与variadic_template静态数据成员斗争,因为我无法用它们来制作它.请考虑以下代码:

template<typename...> struct Base;
template<> struct Base<> { static int cnt; };
int main() { }
Run Code Online (Sandbox Code Playgroud)

首先,我尝试了最明显的事情,至少是对我来说最明显的事情:

template<typename... T> int Base<T...>::cnt = 0;
Run Code Online (Sandbox Code Playgroud)

它回来了error: template definition of non-template ‘int Base<T>::cnt’,我立刻意识到我的尝试确实没有意义.那就是说,之后我有点疑惑,因为对我来说这是不对的,这是正确的语法.

我尝试了以下方法:

template<> int Base<>::cnt = 0;
// ... and ...
template<> int Base::cnt = 0;
Run Code Online (Sandbox Code Playgroud)

随着错误error: template definition of non-template ‘unsigned int Base<T>::cnt’error: ‘template<class ... T> struct Base’ used without template parameters.

到目前为止,我已经使用了variadic templates,我不知道如何使用它们.我甚至无法弄清楚它是否可能以及正确的语法是什么.

任何帮助,将不胜感激.

vso*_*tco 5

使用公正

int Base<>::cnt = 42;
Run Code Online (Sandbox Code Playgroud)

在这一点上,Base<>是一个完全专业化,你不专门的任何东西,所以template<>不再需要,实际上是被禁止的.