我有一组函数,它们都是由一个整数类型Index
和一个类类型T
模板化的。 我通过以下方式“部分专门化”:
// Integer type
enum Index{One,Two,Three,Four};
// Default implementation
template<int I>
struct Foo{
template<typename T> static void bar(const T& x){ std::cout <<"default" << endl; }
};
// Template specializations
template<>
struct Foo<One>{
template<typename T> static void bar(const T& x){ std::cout << "one" << endl; }
};
我使用这个方法在程序运行时选择特定的索引,使用 switch 语句(这应该会产生一个高效的查找表)。这个 switch 不依赖于 T
:
template<typename T>
void barSwitch(int k, const T& x){
switch(k){
case ONE: Foo<ONE>::bar(x); break;
case TWO: Foo<TWO>::bar(x); break;
case THREE: Foo<THREE>::bar(x); break;
}
}
这当然可以正常工作,但是类Foo
并不是我想要应用switch的唯一类。实际上,我有很多类都是由相同的整数类型模板化的。因此,我希望能够将上面的barSwitch
类与函数"Foo"一起“模板化”,以便我可以插入不同的类或不同的函数。我能想到的唯一方法是使用宏:
#define createBarSwitch(f,b) \
template<typename T> \
void barSwitch(int k, const T& x){ \
switch(k){ \
case ONE: f<ONE>::b(x); break; \
case TWO: f<TWO>::b(x); break; \
case THREE: f<THREE>::b(x); break; \
}\
}
有没有更好的、更符合C++风格的方法来做到这一点?