如何解决通过C ++模板从整数到类型的编译时查找
|| 有没有一种方法可以通过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 \”提供我需要的特定协议类型。
我不能使用预处理器将函数“ foo \”创建为宏(使用##或#),原因有两个:(a)它很大,不像本例那样,我不喜欢想要一个巨大的函数编码为宏,并且(b)命名映射不是直接的(即主要版本A和次要版本B不指向类“ ProtocolMajorAMinorB”。
您可能还认为\ FunctionalFoo \应该是基本类型的成员:
您是正确的,但这是从旧版代码生成器生成的代码,即不可触摸。
实际上,为(主要,次要)的每种组合生成了许多函数,例如\“ FunctionalityFoo \”,我不想为它们中的每一个创建if / then / else梯形图。
我尝试了模板专门化,但是找不到有效的语法。
有没有办法通过模板做到这一点?
解决方法
不,模板是编译时构造,因此不能将变量用作模板参数。
为此,您需要执行以下操作(即,不要使用运行时提供的变量):
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>();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。