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));
}
};
そして、Visitableの各サブクラスは次のようになります。
class Mesh : public Object, public Visitable<Mesh> {};
class Text : public Object, public Visitable<Text> {};
そして最後に、訪問者は次のようになります。
class Renderer : public Visitor<Mesh>, public Visitor<Text> {}
これまでのところ良い...今ここに問題があります:
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);
}
}
accept()を呼び出すことができるように、どういうわけかVisitableにキャストする必要がありますが、明らかにTが何であるかわかりません。または、Visitableテンプレートに仮想accept()を追加することはできません。これは、どの引数を取るべきかわからないためです。
C ++テンプレートの第一人者は、これを機能させる方法を知っていますか?