2013-11-14 43 views
3

在編寫程序時,我想出了一段代碼,我無法實現免費的代碼複製。避免用於區分常量和非常量的模板函數中的代碼重複

#include <iostream> 

using namespace std; 

class Presenter{ 
    public: 
     template <typename T> 
      void addField(T& t){ 
       cout << "do something that could happen to modify t" << endl; 
      } 

     template <typename T> 
      void addField(const T& t){ 
       cout << "do something that cannot possibly happen to modify t" << endl; 
      } 
}; 

class Presented{ 
    public: 
     Presented() : a(0), b(0.) {} 
     void bind(Presenter& p){ 
      p.addField(a); 
      p.addField(b); 
      //... 
     } 
     void bind(Presenter& p) const { 
      p.addField(a); 
      p.addField(b); 
      //... 
     } 
    private: 
     int a; 
     double b; 
     //... 
}; 

int main() { 
    Presenter presenter; 
    Presented p1; 
    const Presented p2; 
    p1.bind(presenter); 
    p2.bind(presenter); 
} 

這是一個簡單的虛擬程序,它顯示了這個問題。如您所見,兩個bind函數的代碼(看起來)完全相同。當然不是這樣,因爲使用了兩種不同的功能(addField),這些功能只發生在共享名稱上。

儘管如此,我一直在尋找一種方法來刪除需要逐字寫入void bind(Presenter& p) const

有沒有人看到達到目標的方法?我無法拿出一個。

回答

4

委託給一個模板可以用一個const或Presented一個非const實例調用:

class Presented{ 
public: 
    Presented() : a(0), b(0.) {} 
    void bind(Presenter& p){ 
     bindImpl(p, *this); 

    } 
    void bind(Presenter& p) const { 
     bindImpl(p, *this); 
    } 
private: 
    template<typename P> 
    static void bindImpl(Presenter& p, P& presented) 
    { 
     p.addField(presented.a); 
     p.addField(presented.b); 
    } 

    int a; 
    double b; 
}; 
+0

靜......我是相當那裏,但我沒想到使它的靜態的。非常感謝你! –