如何在 C++ 中实现具有返回类型的访问者模式

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++说不支持模板+虚方法

我的应用程序中的节点只有一种实现,但如果我不使用模板返回类型,我的模型类将取决于我用来为我的应用程序创建图形的工具包。

n. *_* m. 7

如果访问者需要返回值,通常将返回值存储在访问者本身中。因此:

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)