【发布时间】:2015-08-13 19:22:26
【问题描述】:
我有一组(生成的)类,简化后大致如下所示:
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> using Derived = Derived2<typename T::value_type>;? -
我忘了说,我们使用的是专有的 C++2003 编译器。所以没有 C++11
-
那么
template<class T> struct Derived : Derived2<typename T::value_type> { };? -
谢谢!做到了。您可以将其发布为答案,以便我为您投票吗?
-
@T.C.,你应该这样回答。也许
Derived应该继承自Derived2,以防 OP 希望允许“顶级”类型之间进行其他更改。