少し前に使った Visitor パターンを修正しています。仮想メソッドaccept(Visitor)を持つ基本クラスElementがあり、このメソッドはElementから継承するすべてのクラスでオーバーライドされます。また、任意の派生クラスで accept() が行うことは、visitor->visit(*this) を呼び出すことだけです。クライアントがコードを実行すると、たとえば次のようになります。
Visitor& theVisitor = *new ConcreteVisitor();
for_each(elements.begin(), elements.end(), [](Element& e) { e.accept(theVisitor));})
クライアントが次のように Visitor->visit(element) を呼び出すことができない理由:
Visitor& theVisitor = *new ConcreteVisitor();
for_each(elements.begin(), elements.end(), [&theVisitor](Element& e) { theVisitor.visit(e); });
element.accept(visitor) を呼び出して、それが次に visitor.visit(element) を呼び出す場合に役立つ情報は何ですか? これにより、Visitor パターンの使用が煩雑になり、Element クラスのすべての階層で追加のコードが必要になります。
では、誰かがここで accept() の利点を説明できますか?