我有一组(生成的)类,在简化时看起来大致如下:
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 *会导致程序其他部分出现代码爆炸,所以没有完成。
答案 0 :(得分:3)
如评论中所述,这将满足您的需求:
template<class T> struct Derived : Derived2<typename T::value_type> { };