是否可以通过使用 std::variant 来避免继承
Is it possible to avoid inheritance by using std::variant?
我试图看看是否可以在不使用继承的情况下重写以下代码:
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{});
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 在template中使用std::variant的template函数
- 在继承自 std::variant 的类上使用 std::visit——libstdc++ 与 libc++
- 是否可以通过使用 std::variant 来避免继承
- 继承自 boost::variant 和模板化的 AST