我处于这样一种情况:我需要shared_ptr
null
或包含类Bar
的实例。
以下方法不起作用,因为Bar
和nullptr
的类型不同。怎么能实现这个?
class Bar {};
class Foo {
private:
shared_ptr<Bar> b;
public:
Foo() : b(true ? Bar() : nullptr) {
}
};
答案 0 :(得分:2)
b(true ? std::make_shared<Bar>() : nullptr)
答案 1 :(得分:1)
您可以使用
Foo() : b(true ? std::make_shared<Bar>() : nullptr) {}
我的建议是将该逻辑推送到辅助函数。
class Foo {
private:
std::shared_ptr<Bar> b;
static std::shared_ptr<Bar> getB(bool flag)
{
return (flag ? std::make_shared<Bar>() : nullptr);
}
public:
Foo() : b(getB(true)) {}
};
答案 2 :(得分:0)
您的问题是b
的初始化不正确。
b(Bar())
也不会编译。你需要
b(new Bar())
和三元运算符的等价物:
b(true?new Bar():nullptr)
很好。但是,我建议尽可能避免裸new
,并使用
b(true?maked_shared<Bar>():nullptr)
虽然make_shared
会向nullptr
返回不同的类型,但可以通过从shared_ptr
nullptr
来将它们强制转换为相同的类型