我认为编写通用访问者基类模板将是一个简单的练习。目标是能够写
\n\ntypedef visitor<some_base, some_derived1, some_derived2> my_visitor;\nRun Code Online (Sandbox Code Playgroud)\n\n...然后让 my_visitor 成为功能上等效于的类型
\n\nstruct my_visitor {\n virtual void visit(some_base&) {}\n virtual void visit(some_derived1&) {}\n virtual void visit(some_derived2&) {}\n};\nRun Code Online (Sandbox Code Playgroud)\n\n我可以用该类型层次结构的实际有用的派生访问者类继承它,根据需要重写不同的访问()版本。我希望它适用于具有任何继承关系的任意数量的类型,并且我不想使用任何使用 type_info 比较重新实现虚拟函数的技巧。这就是我想出的:
\n\n#include <cstdlib>\n#include <iostream>\n#include <vector>\n\n\n/** This is the generic part that would go in a visitor.hpp header. */\ntemplate <typename T> struct visitor_base {\n virtual void visit(T&) {};\n};\n\ntemplate <typename... T> struct visitor : visitor_base<T>... {};\n\n\n/** This is the part that is specific to a certain type hierarchy. */\nstruct base;\nstruct derived1;\nstruct …Run Code Online (Sandbox Code Playgroud)