c++ - 如何访问`std::variant`的任何孩子的`polymorphic`基类?
问题描述
假设一个基类有几个子类:
class Base
{
public:
void printHello() const { cout << "Hello" << endl; }
};
class Child1: public Base {};
class Child2: public Base {};
class Child3: public Base {};
..
class ChildN: public Base {};
假设一个包含任何包含类的变体:
using MyVariant = std::variant<Base, Child1, Child2, Child3, ... ChildN>;
注意:这样做的好处(与多态指针的简单向量相比)是将所有数据放在同一个内存数组中,因为它们将被传输到设备。在这种情况下,每个对象的真实内容都在向量中,而不仅仅是指向某个
heap
位置的指针。
最后,假设我想使用Base
a 的每个元素的多态版本vector<MyVariant>
。
std::vector<MyVariant> myVariantList;
... // Initialization
for (const MyVariant& elem: myVariantList)
{
const Base* baseElem = get_if_polymorph<Base>(elem); //HOW TO?
baseElem->printHello();
}
注意:显然,
if
对每种类型都有一个语句的简单解决方案不是意图,因为可以添加新的子类MyVariant
而无需更改所有进一步的用法。(可扩展性)
所以另一种表达问题的方式是:
如何管理 std::variant 中的多态性?
解决方案
std::visit
与通用 lambda 一起使用:
const Base& baseElem = std::visit(
[](const auto& x) -> const Base& { return x; },
elem);
最小的可重现示例:
#include <iostream>
#include <variant>
#include <vector>
struct Base {
virtual void hi() const
{
std::cout << "Base\n";
}
};
struct Derived1 : Base {
void hi() const override
{
std::cout << "Derived1\n";
}
};
struct Derived2 : Base {
void hi() const override
{
std::cout << "Derived2\n";
}
};
int main()
{
using Var = std::variant<Base, Derived1, Derived2>;
std::vector<Var> elems;
elems.emplace_back(std::in_place_type<Base>);
elems.emplace_back(std::in_place_type<Derived1>);
elems.emplace_back(std::in_place_type<Derived2>);
for (const auto& elem : elems) {
const Base& x = std::visit(
[](const auto& x) -> const Base& { return x; },
elem);
x.hi();
}
}
输出:
Base
Derived1
Derived2
(现场演示)
推荐阅读
- excel - Copy from Excel Paste in Word
- azure-data-explorer - Getting a list of all the Kusto tables and related metadata with one row per table in result
- node.js - 我怎样才能修复错误反应脚本启动。导入 ml5 后 react npm start 出现此错误
- html - 如何将 html 数字输入限制为仅允许一个点的数字?
- automation - 为什么每当我使用“addon ocrabbyy”命令时机器人会给我错误?
- amazon-web-services - 找不到ecs命令
- angular - 任何 [] 函数参数的打字稿类型保护
- javascript - 是 !!一个隐式强制,是 Boolean() 不完全一样吗?
- react-native - 如何在 React Native 中加载 Web-Assembly 脚本?
- java - Spring boot:将测试中的bean注入Web环境