Próbowałem zmniejszyć ilość tablicy skrótów w moim kodzie, za pomocą C++ Templates do wdrożenia wzorca gościa. Do tej pory mam wymyślić to:Wdrażanie wzorca gościa przy użyciu szablonów 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));
}
};
I każda podklasa visitable wygląda następująco:
class Mesh : public Object, public Visitable<Mesh> {};
class Text : public Object, public Visitable<Text> {};
I wreszcie Visitor wygląda następująco:
class Renderer : public Visitor<Mesh>, public Visitor<Text> {}
tak daleko tak dobrze ... teraz tu 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, abym mógł zadzwonić 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 on przyjąć.
Każdy guru Templating C++ tam wie, jak to zrobić?
Oto obecnie nowoczesny sposób to zrobić: [odwiedzenie-bez-podróżowaniem] (https://backwardsincompatibilities.wordpress.com/2015/10/26/visiting-without-travelling/). – davidhigh