2015-08-13 81 views
0

我有,看起來大致是這樣的一類(生成)一套簡化時:減少重複幾乎模板實例

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 <int>,Derived2 <float>等等的實例,或者至少將類型A,B等的手動參數化實例化類型匹配?

這是一個嵌入式系統,因此目標是減少相同代碼的數量,即使它導致更復雜的C++代碼。用實際類型替換void *會導致程序其他部分的代碼爆炸,所以不會完成。

+1

'模板使用派生= Derived2的;'? –

+0

我忘了提及,我們正在使用專有的C++ 2003編譯器。所以沒有C++ 11 – ojs

+2

然後'template struct Derived:Derived2 {};'? –

回答

3

,張貼在評論這會做你需要的東西:

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