11

我有一个类应该为每个成员变量调用一个访问者方法。像这样的东西:

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。然后非常量accept可以用于“编写/更新”访问者。

4

2 回答 2

14

this您可以创建一个类静态模板帮助函数,该函数将根据您提供给它的指针的类型推断常量。像这样:

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);
    }
};
于 2011-03-09T21:47:03.633 回答
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>
    }
};
于 2011-03-09T21:49:30.247 回答