C ++访问者模式重载

时间:2019-10-29 15:37:28

标签: c++ c++17 variant visitor

过去的几个小时中,我一直在寻找一种优雅的解决方案,但是我却无法做到。

描述:我想在visitor_base_all类中为访问器仿函数提供默认实现,然后每个派生类(例如visitor_override)将根据其需要定义该方法。我知道这是行不通的,因为没有将operator()传递给派生类(由于C ++没有在整个范围内重载,这是很公平的),所以问题是如何确切地做到这一点? 我当时想用重载的lambda来做,或者在虚拟base_class方法中有一个开关,然后每个派生类都只重载该开关中调用的虚拟方法。

关于lambda,我不确定如何执行。 我之前已经阅读过以下内容:pablo_arias arne-mertzstack_overflow_question,但对于什么是正确的正确方法,我仍然有些困惑。

谢谢您的时间

简短的问题:正确的c ++ 17编译/工作方式如下。对于变体和派生类中的大量派生类型,将其概括的正确方法是什么?

(发表评论-编辑)我的问题对于大量的类和更多的类型更为笼统,因此,如果可能的话,我希望以某种方式对其进行模板化/泛化。以下是仅具有1个派生类的示例,但是拥有10个类的正确方法是什么? (如果可以避免的话,我不想在每个变量中都声明使用)。

#include <variant>

struct A{};
struct B{};
struct C{};
using type_x = std::variant<A,B,C>;

class base_class
{
protected:
    struct visitor_base_all
    {
        void operator()(const A& a){std::cout<<"A_base" << std::endl;}
        void operator()(const B& b){std::cout<<"B_base" << std::endl;}
        void operator()(const C& c){std::cout<<"C_base" << std::endl;}
    };
    virtual void run(type_x evt){return std::visit(visitor_base_all{}, evt);}
};

class derived_class :public base_class
{
    struct visitor_override : public visitor_base_all
    {
        void operator()(const C& c){};
    };
     virtual void run(type_x evt){return std::visit(visitor_override{}, evt);}
};

0 个答案:

没有答案