Реализация шаблона посетителя с использованием шаблонов 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, потому что я не знаю, какой аргумент он должен принимать.

Любой гуру шаблонов С++ знает, как это сделать?

20
задан Dave Schweisguth 14 February 2016 в 00:04
поделиться