Implementacja wzorca użytkownika za pomocą szablonów C ++

Próbowałem zredukować ilość szablonu w moim kodzie, używając szablonów C ++ do wdrożenia wzorca odwiedzającego. Do tej pory wymyśliłem to:

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

I każda podklasa Odwiedzających wygląda tak:

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

I w końcu gość wygląda tak:

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

Do tej pory tak dobrze ... teraz jest 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);
    }
}

Muszę jakoś rzucić na Visitable, aby móc wywołać accept (), ale oczywiście nie wiem, co to jest T. Alternatywnie nie mogę dodać wirtualnego accept () do szablonu Visitable, ponieważ nie wiem, jaki argument powinien przyjąć.

Każdy guru templating C ++ wie, jak to zrobić?

questionAnswers(3)

yourAnswerToTheQuestion