是否可以通过使用 std::variant 来避免继承

Is it possible to avoid inheritance by using std::variant?

本文关键字:继承 variant 是否 std 可以通过      更新时间:2023-10-16

我试图看看是否可以在不使用继承的情况下重写以下代码:

struct X {};
struct A : X {};
struct B : X {};
int main() {
    std::unique_ptr<X> xptr = std::make_unique<A>();
}
我尝试使用 std::

variant 重写它,以便我可以使用 std::holds_alternative 和 std::get 而不是使用 dynamic_cast:

struct A;
struct B;
using X = std::variant<A, B>;
struct A {};
struct B {};
int main() {
    X x = A();                                        // works
    std::unique_ptr<X> xptr = std::make_unique<A>();  // doesn't work
}

但是我得到一个错误:当我尝试编译上面的代码时,没有从"unique_ptr"到"unique_ptr"的可行转换。

没有办法使上面的代码工作,或者有没有另一种方法可以避免使用dynamic_cast?

类型 X 和类型 A 是完全不相交的,因此A上的指针(智能与否(不能分配给 X 上的指针。

也许你应该试试这个?

std::unique_ptr<X> xptr = std::make_unique<X>(A{});