繁体   English   中英

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

[英]avoid code duplication in template functions used to distinguish between const and non-const

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

#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

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

委托给可以使用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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM