我正在为std::variant
实现通用std::visit
,我需要针对以下用例进行优化:
std::variant<Base, Derived1, Derived2> x;
std::visit([] (Base&) {/* code */}, x);
这里我们经历了动态分派,尽管不管x的动态类型是什么,都会调用相同的函数!
给定参数列表和重载函数/函子的名称,我如何在编译时检查将调用相同的函数?我试着比较函数指针,但这不起作用…
给定一个重载函数的名称…没关系。如果visitor是重载函数的名称,则不能调用visit。
给定一个函数对象和多个参数列表,确定由重载解析选择的要调用的函数…是很棘手的。
从评论来看,您似乎希望将此特殊情况优化到f(static_cast<Base&>(x.contained_union))
。
通过该类型的成员访问联合,该成员可以不是活动成员。这不仅要求通过重载解析选择相同的函数(如您所问),还要求遵循围绕活动联合成员的规则。也就是说,您只能访问标准布局类型的通用初始序列。所以…类不能是多态的,并且基类不能有任何成员,或者即使有,派生类也不能。
因此,在标准c++中,该优化只适用于相当有限的情况。
但是,对于具有少量类型的单变量访问,您无论如何都想要编写的典型访问是一个简单的切换。
: