2015-08-27 109 views
0

有2個類,大多數代碼是相同的。使用模板來代替預處理?

template<typename T> 
class A1 { 
f1(){common code... do_with(_m) ... common code} 
f2(); 
fn(); 
T _m; 
}; 

template<typename T> 
class A2 { 
f1(){common code... do_with(_m, _b) ... common code} 
f2(); 
fn(); 
B _b; 
std::atomic<T*> _m; 
}; 

因爲95%的代碼是一樣的,我想使那些2級爲一個,但我不能使用預處理因爲他們都將在一個項目中使用。因爲這兩個類是模板,所以我不能使用「模板方法」設計模式將相同的代碼提取到基類中,並將一些私有虛函數留給派生類來覆蓋。

是否有可能避免代碼重複?例如:

A<T, type_a1> a1; 
A<T, type_a2> a2; 

我已經考慮模板專業化,但它不能支持「提取碼的共同部分」,一個專門的類必須重寫整體功能

回答

0

方法1

template <typename T> 
void common_f1_pre(T& t) { ... } 

template <typename T> 
void common_f1_post(T& t) { ... } 

在A1:

f1(){common_f1_pre(_m); do_with(_m); common_f1_post(_m); } 

在A2:

f1(){common_f1_pre(_m); do_with(_m, _b); common_f1_post(_m); } 

方法2

template <typename A> 
void common_f1(A& a) 
{ 
    // Common to A1 and A2 ... } 

    a.f1_core(); 

    // Common to A1 and A2 
} 

在A1:

f1(){f1_common(*this);} 
f1_core() {do_with(_m);} 

在A2:

f1(){f1_common(*this);} 
f1_core() {do_with(_m, _b);}