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

1 回答 1

4

委托给可以使用 const 或非 const 实例调用的模板Presented

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;
};
于 2013-11-14T14:01:42.230 回答