Ale*_*ecs 1 c++ templates design-patterns c++11
我想为我的一个类实现访问者模式,而不必依赖于将实现接口来访问它们的类型。
我的解决方案是这样的:
class model::VisitableNode {
public:
template<class T>
virtual T accept(NodeVisitor<T>);
}
Run Code Online (Sandbox Code Playgroud)
但是C++说不支持模板+虚方法
我的应用程序中的节点只有一种实现,但如果我不使用模板返回类型,我的模型类将取决于我用来为我的应用程序创建图形的工具包。
如果访问者需要返回值,通常将返回值存储在访问者本身中。因此:
NodeVisitor<double> dv;
node->accept(dv);
double result = dv.result();
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢样板,可以将其包装在非虚拟成员中:
class model::VisitableNode {
public:
template<class T>
/* non-virtual */ T accept(NodeVisitor<T>& v) {
do_accept(v);
return v.result;
}
virtual void do_accept(NodeVisitorBase& v) = 0;
}
Run Code Online (Sandbox Code Playgroud)