Implementando el patrón de visitante usando plantillas de C ++

He estado tratando de reducir la cantidad de repeticiones en mi código, utilizando plantillas de C ++ para implementar el patrón de visitantes. Hasta ahora he llegado con esto:

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

Y cada subclase de Visitable se ve así:

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

Y finalmente el Visitante se ve así:

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

Hasta aquí todo bien ... ahora aquí está el 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);
    }
}

De alguna manera necesito convertir a Visitable para que pueda llamar a accept (), pero obviamente no sé qué es T. Alternativamente, no puedo agregar un virtual accept () a la plantilla Visitable, porque no sé qué argumento debería tomar.

¿Algún guru de C ++ Templating sabe cómo hacer que esto funcione?

Respuestas a la pregunta(3)

Su respuesta a la pregunta