减少实际上重复的模板实例化
Reducing virtually duplicate template instantiations
我有一组(生成的)类,简化后大致如下:
class A {
public:
static const int id = 0;
typedef int value_type;
void* data; // actually pointer to int
};
class B {
public:
static const int id = 1;
typedef float value_type;
void* data; // actually pointer to float
};
总共有几十种,类型少得多。我需要创建类来计算所有这些的一些派生值。现在,最明显的解决方案是使用如下模板:
template<class T>
class Derived {
public:
typename T::value_type value;
void update(const void* data) {
value = *static_cast<typename T::value_type*>(data);
// do some calculations
}
};
但是这将为每一个参数类a, B,等等实例化一个单独的类;大部分都是一样的。另一个解决方案是一个明显的模板类,如下所示:
template<typename T>
class Derived2 {
public:
T value;
void update(const void* data) {
value = *static_cast<T*>(data);
}
};
如果类A、B等的模式是由更改生成的,那么这将是使用这个类手动更新代码。是否有一种方法可以使用value_type typedefs来生成Derived2
这是一个嵌入式系统,所以目标是减少相同代码的数量,即使这会导致更复杂的c++代码。用实际类型替换void*s会导致程序其他部分的代码爆炸,所以不这样做。
正如在评论中发布的那样,这将满足您的需求:
template<class T> struct Derived : Derived2<typename T::value_type> { };
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 减少实际上重复的模板实例化
- 为什么编译器尝试实例化一个我实际上没有在任何地方实例化的模板?