减少实际上重复的模板实例化

Reducing virtually duplicate template instantiations

本文关键字:实例化 实际上      更新时间:2023-10-16

我有一组(生成的)类,简化后大致如下:

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, Derived2或者至少将手动参数化实例化的类型与类型A、B等相匹配?

这是一个嵌入式系统,所以目标是减少相同代码的数量,即使这会导致更复杂的c++代码。用实际类型替换void*s会导致程序其他部分的代码爆炸,所以不这样做。

正如在评论中发布的那样,这将满足您的需求:

template<class T> struct Derived : Derived2<typename T::value_type> { };