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
和Typea
完全不相交,因此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
可能更有效,因为它可以避免生成冗余副本。