std::make_unique可以与抽象接口一起使用吗
Can std::make_unique be used with abstract interface?
考虑以下代码行:
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) };
我想说,真正的问题是"你为什么想要这样?"
与
make_shared
不同,make_unique
与new
相比没有分配优势。所以,如果你需要控制指针的类型,你所做的一切都很好。为什么首先需要键入指向
IGpsSource
的指针?存在从std::unique_ptr<Derived>
右值到std::unique_ptr<Base>
右值的隐式转换。因此,如果您实际调用make_unique
来初始化IGpsSource
指针,它将正常工作。如果你想把指针转移到某个地方,你无论如何都必须std::move
,这时转换可能会再次发生。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- Visual C++GC接口如何启用它以及要包含哪个库
- 将fold表达式与std::一起用于两个元组
- Windows.h与GLFW.h的接口
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 与C 一起编译和链接卷曲简易接口
- 是否可以将C++接口与Objective-C一起使用
- 最容易使用的连接器/接口,将MySQL /其他数据库与C++一起使用
- std::make_unique可以与抽象接口一起使用吗
- 将非虚拟接口和多级继承结合在一起
- C++中类的声明将接口与该接口的实现结合在一起