有没有办法通过C ++模板实现编译时类型字典? 例如如果我有这样的课程:
class ProtocolMajor1Minor2 { ... };
class ProtocolMajor4Minor3 { ... };
...
class ProtocolMajor12Minor21 { ... };
...有没有办法使用C ++模板,这可以让我做这样的事情:
void foo(int majorVersion, int minorVersion)
{
LookupMap<majorVersion,minorVersion>::innertype *specific =
new LookupMap<majorVersion,minorVersion>::innertype;
return specific->FunctionalityFoo();
}
如果不清楚,LookupMap的行为就像名称所示:给定两个整数参数(协议主要版本和次要版本),它应该通过innerType“trait”提供我需要的特定协议类型。 / p>
我无法使用预处理器将函数“foo”创建为宏(使用##或#),原因有两个:(a)它很大,不像本例中那样,我不想要一个巨大的函数编码为宏,(b)命名映射不是直接的(即主要版本A和次要版本B不指向类“ProtocolMajorAMinorB”。
您可能也认为“FunctionalityFoo”应该是基本类型的成员: 你是对的,但这是遗留代码生成器生成的代码,即不可触及。 事实上,为(major,minor)的每个组合生成了许多函数,如“FunctionalityFoo”,我不想为每个函数创建if / then / else梯形图。
我尝试过模板专业化但未能找到有效的语法。
有没有办法通过模板来做?
答案 0 :(得分:2)
不,模板是编译时构造,因此您不能将变量用作模板参数。 为此,你需要做这样的事情(即不使用运行时提供的变量):
template <int A, int B>
struct LookupMap { };
template <>
struct LookupMap<1, 2> { typedef Type1_2 innertype; };
// ...
template <int A, int B>
sometype foo() {
typedef typename LookupMap<A, B>::innertype T;
T* ptr = new T; // also, this leaks, use a smart pointer or something
return ptr->something();
}
// when used
foo<1, 2>();