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

时间:2014-10-14 07:53:37

标签: c++ std unique-ptr

考虑以下代码行:

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

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

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

3 个答案:

答案 0 :(得分:15)

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

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

我想说真正的问题是&#34;你为什么要这样做?&#34;

  1. make_shared不同,make_uniquenew相比没有分配优势。因此,如果您需要控制指针的类型,那么您正在做的就好了。

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

答案 1 :(得分:7)

import * as name from './path/to/file';

正如Angew所说,上述情况应该可以正常进行。 提供 std::unique_ptr<Base> base_ptr = std::make_unique<Derived>(); 使用公共继承。只是想为了完整性而添加它。

答案 2 :(得分:-1)

智能指针用于那些不知道自己在做什么的人。在我看来,所有这些增强功能都是对真品的糖衣,这是原始的指针。忘记所有这些(除非您去求职面试),您会做的很好。我的意思是,您必须学习,记住并在脑海中想像到的所有这些事情都是不值得的,它们出现在这里的真正原因是要满足那些自称C ++维护者的自我。他们声称的智能指针的优点确实被随之而来的缺点所抵消,缺点是他们迫使程序员多年来学习的精神复杂性,更不用说使代码看起来更加复杂了。在每个发行版中,C ++变得越来越庞大。我打赌从现在开始二十年了,我将无法阅读为我十年或十五年前编写的同一应用程序编写的C ++代码