考虑以下代码行:
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'要实例化什么样的对象。因为只传递了构造函数的参数,所以似乎无法控制...
答案 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;
与make_shared
不同,make_unique
与new
相比没有分配优势。因此,如果您需要控制指针的类型,那么您正在做的就好了。
为什么首先需要将指针键入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 ++代码