分配“unique_ptr”的简明符号?

Concise notation for assigning `unique_ptr`?

我有一个指向父对象的指针 class,我想有条件地将一个新的子对象分配给该指针。现在,我的语法相当冗长:

std::unique_ptr<ParentClass> parentPtr;
if (...) {  
  parentPtr = std::unique_ptr<ParentClass>(new ChildClass1());  
} else {
  parentPtr = std::unique_ptr<ParentClass>(new ChildClass2());  
}

有什么好的方法可以使它更易读/更短吗?

两种可能性是:

std::unique_ptr<ParentClass> parentPtr(condition ? 
    (ParentClass*)new ChildClass1() : 
    (ParentClass*)new ChildClass2());

如果condition比较复杂,赋值一个boolean然后写构造即可。不过,此解决方案仅适用于二进制条件。

另一种是拥抱C++14,并使用

parentPtr = std::make_unique<ChildClass>();

首先,"obvious" 解决方案 C ? new X : new Y 不起作用,因为即使 XY 有一个共同的基础 class A,类型 X *Y * 没有共同的类型。如果您考虑到 class 可以有多个基数(直接或间接)并且给定类型可能多次作为基数出现,那么这实际上并不令人惊讶。

您可以通过插入强制转换使条件运算符起作用:

A * = C ? static_cast<A *>(new X) : static_cast<A *>(new Y);

但是当您尝试将其应用到您的实际情况时,阅读起来很快就会变得冗长乏味。

但是,对于std::unique_ptr,它提供了reset功能,可以在这里使用效果很好:

std::unique_ptr<A> p;

if (C)
{
    p.reset(new X);
}
else
{
    p.reset(new Y);
}

现在即使实际的 new 表达式很长,这仍然很好读。