Implementieren des Besuchermusters mithilfe von C ++ - Vorlagen

Ich habe versucht, die Anzahl der Boilerplates in meinem Code zu reduzieren, indem ich C ++ - Vorlagen verwendet habe, um das Besuchermuster zu implementieren. Bisher habe ich mir Folgendes ausgedacht:

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

Und jede Unterklasse von Visitable sieht folgendermaßen aus:

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

Und zum Schluss sieht der Besucher so aus:

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

So weit so gut ... jetzt ist hier das Problem:

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

Ich muss irgendwie auf Visitable umwandeln, damit ich accept () aufrufen kann, aber offensichtlich weiß ich nicht, was T ist. Alternativ kann ich der Visitable-Vorlage kein virtuelles accept () hinzufügen, da ich nicht weiß, welches Argument es verwenden soll.

Jeder C ++ Templating-Guru weiß, wie man das macht?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage