Я уверен, что это типичная проблема с шаблоном Visitor, поэтому подумал, что я посмотрю, есть ли стандартное решение.
Как можно перекодировать обход дерева, где методывстроенный в сами классы дерева, скажем
class Node {
void Traverse(SomeType& t) { ... }
};
в код, который использует посетителя.На ум приходят два решения: либо
class Visitor {
stack<SomeType> argumentStack;
void Visit() {
// do work, add new arguments onto stack
// call accept() on child objects
// pop stack
}
};
, либо добавление аргументов в сами методы accept (Visitor &) и visit ().Но тогда это не лучше, чем оригинальный обход, встроенный в классы.
В качестве дополнительной проблемы, что произойдет, если каждый из встроенных методов обхода принимает разные аргументы, или некоторые возвращаемые значения, а другие нет,или они не все возвращают одинаковые типы?