Implementando o padrão de visitante usando modelos C ++

Eu tenho tentado reduzir a quantidade de clichê em meu código, usando modelos C ++ para implementar o padrão de visitante. Até agora eu cheguei com isso:

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));
    }
};

E cada subclasse de Visitável se parece com isso:

class Mesh : public Object, public Visitable<Mesh> {};
class Text : public Object, public Visitable<Text> {};

E finalmente o visitante se parece com isso:

class Renderer : public Visitor<Mesh>, public Visitor<Text> {}

Até aí tudo bem ... agora aqui está o problema:

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);
    }
}

Eu preciso de alguma forma converter para Visitável para que eu possa chamar accept (), mas obviamente eu não sei o que T é. Como alternativa, não posso adicionar um accept () virtual ao modelo Visitável, porque não sei qual argumento deve ser usado.

Qualquer guru de Templating C ++ sabe como fazer isso funcionar?

questionAnswers(3)

yourAnswerToTheQuestion