有条件地使初始化列表中的 shared_ptr 为 null
Conditionally make shared_ptr in initializer list null
我处于需要制作 shared_ptr
null
或包含 class Bar
实例的情况。
下面的方法不起作用,因为 Bar
和 nullptr
不是同一类型。怎样才能做到这一点?
class Bar {};
class Foo {
private:
shared_ptr<Bar> b;
public:
Foo() : b(true ? Bar() : nullptr) {
}
};
b(true ? std::make_shared<Bar>() : nullptr)
您可以使用
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)) {}
};
你的问题是你对b
的初始化不正确。
b(Bar())
也不会编译。你需要
b(new Bar())
和三元运算符的等价物:
b(true?new Bar():nullptr)
很好。但是,我建议尽可能避免裸露 new
,并使用
b(true?maked_shared<Bar>():nullptr)
尽管 make_shared
returns 是与 nullptr
不同的类型,但可以通过从 nullptr
构造空的 shared_ptr
将它们强制转换为同一类型
我处于需要制作 shared_ptr
null
或包含 class Bar
实例的情况。
下面的方法不起作用,因为 Bar
和 nullptr
不是同一类型。怎样才能做到这一点?
class Bar {};
class Foo {
private:
shared_ptr<Bar> b;
public:
Foo() : b(true ? Bar() : nullptr) {
}
};
b(true ? std::make_shared<Bar>() : nullptr)
您可以使用
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)) {}
};
你的问题是你对b
的初始化不正确。
b(Bar())
也不会编译。你需要
b(new Bar())
和三元运算符的等价物:
b(true?new Bar():nullptr)
很好。但是,我建议尽可能避免裸露 new
,并使用
b(true?maked_shared<Bar>():nullptr)
尽管 make_shared
returns 是与 nullptr
不同的类型,但可以通过从 nullptr
构造空的 shared_ptr
将它们强制转换为同一类型