11

すべてのメンバー変数に対して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ですconstacceptそうすれば、non-constは訪問者の「書き込み/更新」に使用できるようになります。

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 に答える