【发布时间】:2014-08-18 14:34:36
【问题描述】:
我不明白为什么可变参数模板的模板专业化不同于常规(即非可变参数)模板。例如,我有一个模板和一个专业化,例如:
enum class MF : int {
ZERO = 0,
ONE = 1,
TWO = 2
};
// --------- Specialization -------------
template <MF mf>
class Stat{
public:
Stat(std::string msg) {
cout << "Generic Stat construtor: " << msg << endl;
}
};
// --------- Template Specialization -------------
template<>
class Stat<MF::ONE>{
public:
Stat(std::string msg) {
cout << "Specialized Stat constructor: " << msg << endl;
}
};
我专门研究了MF 枚举的特定值。
现在,如果我想专门化一个可变参数模板,我不能用 MF 枚举的特定值(例如,MF::ONE)专门化可变参数模板参数,我只能专门化一个类型,(例如 @ 987654326@).
// --------- Variadic Template -------------
template<MF mf, typename... E>
class Var{
public:
Var(std::string msg){
cout << "Generic Var constructor: " << msg << endl;
}
};
// --------- Variadic Template Specialization -------------
template<>
class Var<MF::TWO, MF>{
public:
Var(std::string msg){
cout << "Specialized Var constructor: " << msg << endl;
}
};
我想将我的可变参数模板专门用于特定的MF 值,但似乎我做不到。
我是否缺少语言的某些方面可以让我做我想做的事?大致如下:
template<>
class Var<MF::TWO, MF::ONE>{
public:
Var(std::string msg){
cout << "Specialized Var constructor: " << msg << endl;
}
};
完整的例子可以在here找到
【问题讨论】:
-
but it doesn't appear that I can.你有没有收到错误或什么? -
MF::ONE是typename吗?那么,您为什么期望能够将其传递给typename...? -
MF::ONE是一个枚举值。 -
@Paranaix 如果我像
class Var<MF::TWO, MF::ONE>那样专精,代码将无法编译。我收到此错误error: template argument for template type parameter must be a type class Var<MF::TWO, MF::ONE>{
标签: c++ templates c++11 variadic-templates specialization