【发布时间】:2019-10-06 09:53:15
【问题描述】:
假设一个基类有几个子类:
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位置。
最后,假设我想使用vector<MyVariant> 的每个元素的Base 多态版本。
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 中的多态性?
【问题讨论】:
-
非常好的问题。谢谢。
标签: c++ inheritance polymorphism c++17 variant