【发布时间】:2023-03-28 11:48:02
【问题描述】:
我一直在尝试通过使用 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++ 模板大师知道如何完成这项工作吗?
【问题讨论】:
-
这是当前的现代方法:visiting-without-travelling.
标签: c++ templates visitor-pattern