每种类型的模板虚拟方法

Pat*_*ght 1 c++ templates c++17

如果我有这样的模板:

template <typename ... TYPES>
class Visitor {
public:
    //virtual void visit(...) {}
};
Run Code Online (Sandbox Code Playgroud)

有没有办法让 C++ 为列表中的“每个”类型生成虚拟方法?

例如,从概念上讲,我想

class A;
class B;
class C;

class MyVisitor : public Visitor<A,B,C>;
Run Code Online (Sandbox Code Playgroud)

具有以下虚拟方法

virtual void visit(const A&) {}
virtual void visit(const B&) {}
virtual void visit(const C&) {}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 8

Visitor您可以为其中的每个类型添加一个基类模板,为所提供的类型TYPES定义一个函数,然后您将从这些基类继承。visit那看起来像

template <typename T>
class VisitorBase
{
public:
    virtual void visit(const T&) { /* some code */ }
};

template <typename ... TYPES>
class Visitor : public VisitorBase<TYPES>... 
{
public:
    using VisitorBase<TYPES>::visit...; // import all visit functions into here
};
Run Code Online (Sandbox Code Playgroud)