これは Visitor パターンの一般的な問題であるに違いないので、標準的な解決策があるかどうかを確認したいと思います。
メソッドがツリークラス自体に組み込まれているツリートラバーサルをどのように再コーディングできますか?
class Node {
void Traverse(SomeType& t) { ... }
};
ビジターを使用するコードに。頭に浮かぶ2つの解決策は次のいずれかです
class Visitor {
stack<SomeType> argumentStack;
void Visit() {
// do work, add new arguments onto stack
// call accept() on child objects
// pop stack
}
};
または、accept(Visitor&) および visit() メソッド自体に引数を追加します。しかし、これは、クラスに組み込まれた元のトラバーサルに勝るものはありません。
さらなる問題として、組み込みトラバーサル メソッドのそれぞれが異なる引数を取る場合、または一部の戻り値と他の戻り値がない場合、またはすべてが同じ型を返さない場合はどうなるでしょうか?