有条件地将初始化列表中的shared_ptr设为null

时间:2018-03-07 17:31:29

标签: c++ c++11 constructor shared-ptr

我处于这样一种情况:我需要shared_ptr null或包含类Bar的实例。

以下方法不起作用,因为Barnullptr的类型不同。怎么能实现这个?

 class Bar {};

 class Foo {

    private:
       shared_ptr<Bar> b;

    public:
       Foo() : b(true ? Bar() : nullptr) {
       }

 };

3 个答案:

答案 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来将它们强制转换为相同的类型