Реализация шаблона посетителя с использованием шаблонов C ++
Я пытался уменьшить количество шаблонов в моем коде, используя шаблоны C ++ для реализации шаблона посетителя. До сих пор я придумал это:
class BaseVisitor {
public:
virtual ~BaseVisitor() {}
};
template<typename T>
class Visitor : public BaseVisitor {
public:
virtual void visit(T& /* visitable */) = 0;
};
template<typename Derived>
class Visitable {
public:
void accept(Visitor<Derived>& visitor) {
visitor.visit(static_cast<Derived&>(*this));
}
};
И каждый подкласс Visitable выглядит так:
class Mesh : public Object, public Visitable<Mesh> {};
class Text : public Object, public Visitable<Text> {};
И наконец, Посетитель выглядит так:
class Renderer : public Visitor<Mesh>, public Visitor<Text> {}
Пока все хорошо ... вот в чем проблема:
for(Scene::iterator it = scene.begin(); it != scene.end(); ++it) {
Object& object = static_cast<Object&>(*it);
if(pre_visit(object)) {
object.accept(this); ///Erm, what do I cast to??
post_visit(object);
}
}
Мне нужно как-то привести в Visitable, чтобы я мог вызвать accept (), но, очевидно, я не знаю, что такое T. В качестве альтернативы, я не могу добавить виртуальный метод accept () в шаблон Visitable, потому что я не знаю, какой аргумент он должен принимать.
Любой гуру C ++ Templating знает, как заставить это работать?