我有一个类层次结构(简化)如下所示:
struct A {};
struct B : public A {};
struct C {
A* object;
};
我想在其他类中存储对此层次结构中对象的引用,但该对象可以是 B 的实例,也可以是存储 B 实例的 C 实例。是否有一种惯用的方法来执行此操作,或者应该我重新考虑我的班级结构?仅供参考,我不能只是将 B 和 C 设为某个新类的子类,然后存储对该超类的引用,因为它们在概念上具有不同的目的并包含不同的字段和方法。
std::variant
正是您所寻求的。看到 B
和 C
没有任何关系,多态性在这里无济于事。所以这样做:
std::variant<B, C> b_or_c;
b_or_c = B{};
C value;
try
{ value = std::get<C>(b_or_c); }
except (const std::bad_variant_access& exception)
{ std::cout << exception.what(); }