分配`unique_ptr`的简明表示法?

时间:2015-01-28 08:22:43

标签: c++11 polymorphism unique-ptr

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

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

有没有一种方法可以使这个更具可读性/更少长度?

2 个答案:

答案 0 :(得分:2)

两种可能性是:

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

如果条件复杂,只需为其指定一个布尔值,然后编写构造。此解决方案仅适用于二进制条件。

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

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

答案 1 :(得分:1)

首先,&#34;显而易见&#34;解决方案C ? new X : new Y不起作用,因为即使XY具有公共基类A,类型X *Y *也没有普通类型。毕竟,如果你认为一个类可以有很多基础(直接或间接)并且给定的类型可能多次出现,那么这实际上并不令人惊讶。

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

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表达式很长,这仍然可以很好地阅读。