我試圖使用策略重構一些代碼(請參閱書籍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(){};
};
,並希望注入Policy1class
爲Hostclass
。這意味着我必須更改標題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 {
};
任何其他建議?
你爲什麼不做一些像'template struct Hostclass:Policies ...''? –
哎呀...因爲有時候最明顯的解決方案不會出現在我的腦海裏。 – claudio