避免模​​板函数中的代码重复用于区分const和非const

时间:2013-11-14 13:56:43

标签: c++ templates code-duplication

在编写程序时,我想出了一段代码,我无法让代码重复免费。

#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的必要性。

有没有人看到达到目标的方法?我无法想出一个。

1 个答案:

答案 0 :(得分:4)

委托给一个可以用Presented的const或非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;
};