Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 减少几乎重复的模板实例化_C++_Templates - Fatal编程技术网

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