2016-03-15 48 views
0

我試圖使用策略重構一些代碼(請參閱書籍Modern C++ Design),並且希望縮短或簡化主機類方法的代碼。比方說,我有一個已經實現的類名爲Hostclass在基於策略的重構中縮短模板參數

// Hostclass header, start version 
struct Hostclass { 
    void Hostfct1(); 
    void Hostfct2(); 
    ... 
}; 
// method definitions, start version 
void 
Hostclass::Hostfct1(){...} 

void 
Hostclass::Hostfct2(){...} 
... 

現在我有一個策略類

struct Policy1class { 
    void Policy1fct(){}; 
}; 

,並希望注入Policy1classHostclass。這意味着我必須更改標題Hostclass

// Hostclass header, second version 
template <typename Policy1> 
struct Hostclass : public Policy1 { 

但是,這些方法呢? Hostclass現在是一個模板類,因此函數。定義需求的一種符:

// method definitions, second version 
template <typename Policy1> 
void 
Hostclass<Policy1>::Hostfct() {...} 
... 

現在我想用另外一個策略

struct Policy2class { 
    void Policy2fct(){}; 
}; 

,所以我要再次改變頭進一步豐富Hostclass

// Hostclass header, third version 
template <typename Policy1, typename Policy2> 
struct Hostclass : public Policy1, Policy2 { 

還有符:

// method definitions, third version 
template <typename Policy1, typename Policy2> 
void 
Hostclass<Policy1,Policy2>::Hostfct() {...} 
... 

我認爲每次新策略進入階段時改變所有主機類方法的所有說明符有點屁股疼痛是否有可能使用,或許用C++ 14及其模板別名的新工具或extern template,來簡化此方法的定義?我有類似的東西

// invalid code 
class P1; 
class P2; 
using H = Hostclass<P1,P2>; 
// method definitions, dream version 
void 
H::Hostfct1() {...} 

void 
H::Hostfct2() {...} 
... 

記。我能想到的規避定義規格的唯一的選擇是實現HostclassWrapper類從Hostclass繼承自身和所有其他政策:

// Hostclass header, start version 
struct Hostclass {...}; 
// method definitions, start version 
void 
Hostclass::Hostfct1(){...} 
// new wrapper class 
template <typename Policy1, typename Policy2> 
class HostclassWrapper : public Hostclass, Policy1, Policy2 { 
}; 

任何其他建議?

+2

你爲什麼不做一些像'template struct Hostclass:Policies ...''? –

+0

哎呀...因爲有時候最明顯的解決方案不會出現在我的腦海裏。 – claudio

回答

5

你可以簡單地使用可變參數模板:

template <class... Policies> 
class Host : public Policies... { ... } 

template <class... Policies> 
void Host<Policies...>::func() { ... } 

唯一的辦法解決,避免重複在每一個成員函數定義的模板聲明是隻定義所有的類定義本身。

但是,如果您支持一些任意數量的策略,可變模板絕對是您想要的。

+1

謝謝你的快速和完全正確的答案。 @Dark Falcon早兩分鐘就已經評論過了。我只是有點懊惱,我投入了這樣的努力來制定和格式化這個長期的問題,這個問題可以通過一個簡短明瞭的簡單解決方案來解決。 – claudio