过去的几个小时中,我一直在寻找一种优雅的解决方案,但是我却无法做到。
描述:我想在visitor_base_all类中为访问器仿函数提供默认实现,然后每个派生类(例如visitor_override)将根据其需要定义该方法。我知道这是行不通的,因为没有将operator()传递给派生类(由于C ++没有在整个范围内重载,这是很公平的),所以问题是如何确切地做到这一点? 我当时想用重载的lambda来做,或者在虚拟base_class方法中有一个开关,然后每个派生类都只重载该开关中调用的虚拟方法。
关于lambda,我不确定如何执行。 我之前已经阅读过以下内容:pablo_arias arne-mertz和stack_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);}
};