减少几乎重复的模板实例化

时间:2015-08-13 19:22:26

标签: c++ templates

我有一组(生成的)类,在简化时看起来大致如下:

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 typedef生成Derived2&lt; int&gt;,Derived2&lt; float&gt;的实例化?等,或至少将手动参数化实例的类型与类型A,B等相匹配?

这是一个嵌入式系统,因此目标是减少相同代码的数量,即使它会导致更复杂的C ++代码。用实际类型替换void *会导致程序其他部分出现代码爆炸,所以没有完成。

1 个答案:

答案 0 :(得分:3)

如评论中所述,这将满足您的需求:

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