C++ 减少几乎重复的模板实例化
我有一组(生成的)类,简化后大致如下:C++ 减少几乎重复的模板实例化,c++,templates,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 poin
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
}
};
template<typename T>
class Derived2 {
public:
T value;
void update(const void* data) {
value = *static_cast<T*>(data);
}
};
模板
类派生{
公众:
typename T::value\u type value;
无效更新(常量无效*数据){
值=*静态_转换(数据);
//做一些计算
}
};
但这将为每个参数类a、B等实例化一个单独的类;其中大部分将是相同的。另一个解决方案是一个明显的模板类,如下所示:
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
}
};
template<typename T>
class Derived2 {
public:
T value;
void update(const void* data) {
value = *static_cast<T*>(data);
}
};
模板
派生类2{
公众:
T值;
无效更新(常量无效*数据){
值=*静态_转换(数据);
}
};
如果类A、B等的模式是由更改生成的,则这将是使用此类手动更新代码。是否有方法使用值_type typedefs生成Derived2、Derived2等的实例化,或至少将手动参数化实例化的类型与类型a、B等匹配
这是一个嵌入式系统,所以目标是减少相同代码的数量,即使它导致更复杂的C++代码。用实际类型替换void*s会导致程序其他部分的代码爆炸,因此无法执行。
如评论中所述,这将满足您的需要:template<class T> struct Derived : Derived2<typename T::value_type> { };
模板结构派生:Derived2{};
如评论中所述,这将满足您的需要:
template<class T> struct Derived : Derived2<typename T::value_type> { };
模板结构派生:Derived2{};
如评论中所述,这将满足您的需要:
template<class T> struct Derived : Derived2<typename T::value_type> { };
模板结构派生:Derived2{};
如评论中所述,这将满足您的需要:
template<class T> struct Derived : Derived2<typename T::value_type> { };
模板结构派生:Derived2{};
使用派生=Derived2的模板代码>?我忘了提到,我们使用的是专有的C++2003编译器。所以没有C++11Then模板结构派生:Derived2{}代码>?谢谢!成功了。你能把它作为一个答案,这样我就可以投票给你了吗?@T.C.,你应该把它作为一个答案。如果OP希望允许在“顶级”类型之间进行其他更改,派生的
应该继承自派生的
代码>?我忘了提到,我们使用的是专有的C++2003编译器。所以没有C++11Then模板结构派生:Derived2{}代码>?谢谢!成功了。你能把它作为一个答案,这样我就可以投票给你了吗?@T.C.,你应该把它作为一个答案。如果OP希望允许在“顶级”类型之间进行其他更改,派生的
应该继承自派生的
代码>?我忘了提到,我们使用的是专有的C++2003编译器。所以没有C++11Then模板结构派生:Derived2{}代码>?谢谢!成功了。你能把它作为一个答案,这样我就可以投票给你了吗?@T.C.,你应该把它作为一个答案。如果OP希望允许在“顶级”类型之间进行其他更改,派生的
应该继承自派生的
代码>?我忘了提到,我们使用的是专有的C++2003编译器。所以没有C++11Then模板结构派生:Derived2{}代码>?谢谢!成功了。你能把它作为一个答案,这样我就可以投票给你了吗?@T.C.,你应该把它作为一个答案。如果OP希望允许在“顶级”类型之间进行其他更改,那么,Derived
可能应该继承自Derived2
。