У меня есть полиморфное дерево, и я пытаюсь добавить функциональность, например, сравнивать два узла без использования RTTI, как dynamic_cast
. Подход, который я использую, - это шаблон посетителей.
Проблема, с которой я столкнулся, заключается в том, что шаблон посетителя не позволяет мне работать с какими-либо параметрами или получать типы возврата из функций.
Например, если я хочу написать посетителя, который сравнивает два узла
class AbstractDispatch{
public:
virtual void visit(NodeFoo &operand) = 0;
virtual void visit(NodeBar &operand) = 0;
//...for all types.
};
class CompareVisitor{
public:
void visit(NodeFoo &operand) override;
//...
};
class SetVisitor{
public:
void visit(NodeFoo &operand) override;
//...
};
void CompareVisitor::visit(NodeFoo &operand){
//compare operand to what?
//get result of comparison how?
}
void SetVisitor::visit(NodeFoo &operand){
//set operand to what?
}
Моя текущая идея - добавить другие функции и члены в классы посетителей. Это позволило бы мне сделать что-то вроде этого:
Base *object = new NodeFoo();
CompareVisitor compare;
compare.set_parameters(NodeFoo(/* */));
object->accept(compare);
bool result = compare.get_result();
Я мог бы установить параметры посетителя сравнения и обойти дерево, проверяя его на наличие узлов и выполняя другие подобные операции.
Другим решением было бы сохранить информацию о типе узла в узле и выполнить проверку get_type () для безопасного приведения.
dynamic_cast
медленно, но если иерархия типа узла предельно проста, может ли она быть быстрее? Есть ли лучшие шаблоны проектирования для выполнения чего-то подобного?