c++ - 避免用于区分常量和非常量的模板函数中的代码重复

标签 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 的需要。

有没有人看到实现目标的方法?我想不出一个。

最佳答案

委托(delegate)给一个模板,该模板可以用 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;
};

关于c++ - 避免用于区分常量和非常量的模板函数中的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19979575/

相关文章:

具有默认参数的 C++ 模板

c# - 在 C# 中使用泛型和 Func 避免代码重复的最佳方法

c++ - 如何避免访问者和 const 访问者基类中的代码重复

javascript - 如何防止 jquery 中的代码重复?

c++ - 用一对索引 STL 映射是个好主意吗?

c++ - 我怎样才能有一个具有许多值的关联数组

C++ 控制台窗口仅从 USB 获取输入

c++ - 解析字符串以创建元素列表

templates - Flask 中的 Jinja2 模板无法呈现 CONTINUE 语句

c++ - 是否可以循环遍历模板参数?