[英]How to avoid code duplication between similar const and non-const member functions which pass class members to callbacks?
[英]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.