2013-02-15 41 views
4

我有一個這樣的接口(除了很多很多在真實庫的代碼比這更長)如何避免重複代碼的靜態多態性

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 ..有沒有更好的辦法?

+0

Hope [this](http://en.wikipedia.org/wiki/Template_method_pattern)有幫助。 – 2013-02-15 02:10:07

+0

如何使用其他方法中內聯的通用代碼的單獨方法? – wich 2013-02-15 02:26:11

+0

@wich,想到了這一點...目前我已經實現了一個帶有靜態偏移量的模板專用結構宏。 – 2013-02-15 02:58:29

回答

1

不知道如果我完全理解你在找什麼,但我會給它一個鏡頭。作爲第一步,可以這樣考慮:

struct NotSoUgly : public IFooHelper<NotSoUgly> 
{ 
    void updateCounter(A& a) { //update some counter for type A objs; } 
    void updateCounter(B& b) { //update some counter for type B objs; } 
    void updateCounter(C& c) { //update some counter for type C objs; } 

    template <class T> void onGeneric(T& t) { 
     //8 lines of common code; 
     updateCounter(t); 
    } 
}; 

進一步的改善是可能的,如果你想向我們展示的updateCounter()方法的內容,我們可以拿出一個通用的實施,作爲好,但沒有看到代碼,很難猜測。

+0

謝謝,鑑於目前的情況,這似乎是最好的。我將在幾個小時內進行編輯,以顯示我最終做了什麼。 – 2013-02-21 17:00:15