我有一个类应该为每个成员变量调用一个visitor方法。像这样:
class A{
int a, b, c;
public:
void accept(Visitor &visitor){
visitor.visit(a);
visitor.visit(b);
visitor.visit(c);
}
};
如何在没有代码重复的情况下使用相同的代码获取void accept() const
方法?
重复的显而易见的解决方案是添加方法:
void accept(Visitor &visitor) const {
visitor.visit(a);
visitor.visit(b);
visitor.visit(c);
}
该方法具有我想要的含义,但我想避免代码重复。这两种方法的原因是能够通过“阅读”访问者读取变量,并且accept
方法很好地const
。然后非const accept
可用于“写入/更新”访问者。
答案 0 :(得分:13)
您可以创建一个类静态模板帮助函数,该函数将根据您提供给它的this
指针的类型推导出constness。像这样:
class A{
int a, b, c;
public:
void accept(Visitor &visitor){
acceptImpl(*this, visitor);
}
void accept(Visitor &visitor) const{
acceptImpl(*this, visitor);
}
private:
template<typename t_A>
static void acceptImpl(t_A& aObj, Visitor &visitor)
{
visitor.visit(aObj.a);
visitor.visit(aObj.b);
visitor.visit(aObj.c);
}
};
答案 1 :(得分:2)
模板助手:
class A{
int a, b, c;
private:
template <typename T>
static void do_visiting(T &self, Visitor &visitor) {
visitor.visit(self.a);
visitor.visit(self.b);
visitor.visit(self.c);
}
public:
void accept(Visitor &visitor) {
do_visiting(*this, visitor); // calls do_visiting<A>
}
void accept(Visitor &visitor) const {
do_visiting(*this, visitor); // calls do_visiting<const A>
}
};