分配“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
不起作用,因为即使 X
和 Y
有一个共同的基础 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
表达式很长,这仍然很好读。
我有一个指向父对象的指针 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
不起作用,因为即使 X
和 Y
有一个共同的基础 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
表达式很长,这仍然很好读。