我一直试图通过使用C++模板来实现访问者模式来减少我的代码中样板的数量。到目前为止,我想出了这一点:使用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);
}
}
我需要以某种方式投向Visitable,以便我可以调用accept(),但显然我不知道T是什么。或者,我不能将虚拟accept()添加到Visitable模板,因为我不知道应该采用什么参数。
任何C++模板大师的外面知道如何使这项工作?
下面是做到这一点的目前现代的方式:参观 - 无需行进(https://backwardsincompatibilities.wordpress.com/2015/10/26/visiting-without-travelling/)。 – davidhigh 2016-02-14 00:49:39