通过C++模板编译从整数到类型的时间查找
Compile-time lookup from integer to type via C++ templates
有没有一种方法可以通过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"。
您可能还认为"FunctionalityFoo"应该是基类型的成员:您是对的,但这是由遗留代码生成器生成的代码,即不可接触的。事实上,有很多像"FunctionalityFoo"这样的函数是为(major,minor)的每个组合生成的,我不想为它们中的每一个创建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>();
相关文章:
- 使用简单类型列表实现的指数编译时间.为什么
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 标准::时间::d类型的挥发性对象
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 将结构时间规范添加到类(似乎没有其他类型的)会导致EXEC_BAD_ACCESS
- 无法将 int 类型转换为时间类型(我的类类型)
- C++编译时间类型确定
- 通过引用传递基元类型(如 int、bool)是否比按值传递有任何加速?还是会恶化时间/空间的使用
- C 函数在编译时间返回类型
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- 如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- 如何使用谷歌测试打印标准::时间类型
- C 编译时间检查模板类型中是否存在方法
- 在编译时间检查模板参数类型是否设置或多键,并且容器的元素类型是算术的
- 运算符/ STD :: Chrono ::持续时间和自定义类型与Clang
- 编译时间矩阵模板类型
- 类类型的静态constexpr字段在g++中给出链接时间错误
- C 中使用了哪种类型的堆以及STD :: Pirstity_queue的时间复杂性
- STD :: Min of std :: Chrono ::不同类型的持续时间