std::make_unique可以与抽象接口一起使用吗

Can std::make_unique be used with abstract interface?

本文关键字:一起 接口 抽象 make unique std      更新时间:2023-10-16

考虑以下代码行:

auto source1 = std::unique_ptr<IGpsSource>(new GpsDevice(comPort, baudrate));
auto source2 = std::unique_ptr<IGpsSource>(new GpsLog(filename));

如何使用VS 2013支持的新std::make_unique函数来编写?这可能吗?*

*我的问题是,我不知道如何告诉std::make_unique要实例化什么样的对象。因为只传递构造函数的参数,所以似乎无法控制它。

std::unique_ptr<Base> base_ptr = std::make_unique<Derived>();

正如Angew所说,以上内容应该很好提供Derived使用公共继承。只是为了完整起见想添加它。

是的,当然可以使用make_unique,但它并不像您想要的那样有用。您有以下选项:

std::unique_ptr<IGpsSource> source1 = std::make_unique<GpsDevice>(comPort, baudrate);
auto source2 = std::unique_ptr<IGpsSource>{ std::make_unique<GpsLog>(filename) };

我想说,真正的问题是"你为什么想要这样?"

  1. make_shared不同,make_uniquenew相比没有分配优势。所以,如果你需要控制指针的类型,你所做的一切都很好。

  2. 为什么首先需要键入指向IGpsSource的指针?存在从std::unique_ptr<Derived>右值std::unique_ptr<Base>右值的隐式转换。因此,如果您实际调用make_unique来初始化IGpsSource指针,它将正常工作。如果你想把指针转移到某个地方,你无论如何都必须std::move,这时转换可能会再次发生。