我有一個這樣的接口(除了很多很多在真實庫的代碼比這更長)如何避免重複代碼的靜態多態性
struct IFoo
{
virtual void onA(A& a) = 0;
virtual void onB(A& a) = 0;
virtual void onC(A& a) = 0;
};
,這是常見的對我實施的IFoo
不同的聽衆。所以現在
template <class T>
struct IFooHelper {
virtual void onA(A& a) { static_cast<T*>(this)->onGeneric(a); }
virtual void onB(B& b) { static_cast<T*>(this)->onGeneric(b); }
virtual void onC(C& c) { static_cast<T*>(this)->onGeneric(c); }
};
,當我在聽衆有很多共同的行爲,而不是提供每一個IFoo
功能的虛擬覆蓋,I:正因爲如此,我設計了一個輔助類,像這樣的可以這樣做:
struct Fox : public IFooHelper<Fox>
{
template <class T> void onGeneric(T& t) { //do something general }
void onD(D& d) { //special behavior only for a type D }
};
這飛馳的效果很好,但現在我實現了,我想一些常見的行爲,然後再更新計數器,也就是說,其呼叫類型,這是一個傾聽者。換句話說,假設我只有爲上述各類A,B,C
,我的聽衆是:
struct Ugly : public IFooHelper<Ugly>
{
void onA(A& a) { //8 lines of common code; //update some counter for type A objs; }
void onB(B& b) { //8 lines of common code; //update some counter for type B objs; }
void onC(C& c) { //8 lines of common code; //update some counter for type C objs; }
};
在這裏,調用必須非常快(所以沒有查找)和理想,我將能夠利用IFooHelper
將常見行爲提升到模板方法中,然後以某種方式仍然能夠區分類型。我想像一個模板專門的結構與偏移到一個靜態缺陷字符*數組..或與價值本身是char *取決於T
..有沒有更好的辦法?
Hope [this](http://en.wikipedia.org/wiki/Template_method_pattern)有幫助。 – 2013-02-15 02:10:07
如何使用其他方法中內聯的通用代碼的單獨方法? – wich 2013-02-15 02:26:11
@wich,想到了這一點...目前我已經實現了一個帶有靜態偏移量的模板專用結構宏。 – 2013-02-15 02:58:29