gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:01:00 26 4
gpt4 key购买 nike

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

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com