C++ 使用std::variant可以避免继承吗?

C++ 使用std::variant可以避免继承吗?,c++,C++,我试图看看是否可以在不使用继承的情况下重写以下代码: struct X {}; struct A : X {}; struct B : X {}; int main() { std::unique_ptr<X> xptr = std::make_unique<A>(); } struct X{}; 结构A:X{}; 结构B:X{}; int main(){ std::unique_ptr xptr=std::make_unique(); } 我尝试使用std

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

struct X {};
struct A : X {};
struct B : X {};

int main() {
    std::unique_ptr<X> xptr = std::make_unique<A>();
}
struct X{};
结构A:X{};
结构B:X{};
int main(){
std::unique_ptr xptr=std::make_unique();
}
我尝试使用std::variant重写它,这样我就可以使用std::holds\u alternative和std::get而不是使用dynamic\u 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
}
结构A;
结构B;
使用X=std::variant;
结构A{};
结构B{};
int main(){
X=A();//有效
std::unique_ptr xptr=std::make_unique();//不起作用
}
但是我得到了一个错误:当我试图编译上面的代码时,没有从‘unique_ptr’到‘unique_ptr’的可行转换


有没有一种方法可以使上述代码正常工作,或者有没有另一种方法可以避免使用动态强制转换?

Type
X
和Type
a
完全不相交,因此
a
上的指针(智能或非智能)不能分配给
X
上的指针

也许你应该试试这个

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

这两个代码片段做了两件完全不同的事情。它看起来像一个-你能解释你原来的问题吗?你可能对以下两篇文章感兴趣:为什么你希望能够在
std::unique\u ptr
中存储
std::unique\u ptr
?你可以重写代码来做任何事情,但是如果没有您的要求和限制,我们无法保证给您一个有用的建议。您想做什么?问题是,如果您确实需要继承,为什么要避免继承?实际上,根据类的不同,使用
std::in\u place\u type\t
可能更有效,因为它可以避免生成冗余副本。