【问题标题】:Conditionally make shared_ptr in initializer list null有条件地使初始化列表中的 shared_ptr 为空
【发布时间】:2018-03-07 17:31:28
【问题描述】:

我需要创建一个shared_ptr 或者null 或者包含一个类Bar 的实例。

下面的方法不起作用,因为Barnullptr 不是同一类型。怎样才能做到这一点?

 class Bar {};

 class Foo {

    private:
       shared_ptr<Bar> b;

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

 };

【问题讨论】:

  • 对于一般的这种模式(即计算初始化器),您可以使用私有辅助函数来生成初始值。在内联、移动语义和 RVO 之间,这种方法的开销可以几乎为零。
  • 另外,您可以有 2 个不同的 Foo 构造函数,其中一个接受 bar 的参数,另一个创建一个 nullptr。

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


【解决方案1】:

b(true ? std::make_shared&lt;Bar&gt;() : nullptr)

【讨论】:

  • 不错!这是如何工作的? nullptr 是 nullptr_t 类型, std::make_shared() 返回 shared_ptr 类型
【解决方案2】:

你可以使用

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)) {}

};

【讨论】:

    【解决方案3】:

    您的问题是您对b 的初始化不正确。

    b(Bar())
    

    也不会编译。你需要

    b(new Bar())
    

    和三元运算符的等价物:

    b(true?new Bar():nullptr)
    

    很好。但是,我建议尽可能避免赤裸裸的new,并使用

    b(true?maked_shared<Bar>():nullptr)
    

    虽然make_sharednullptr 返回不同的类型,但可以通过从nullptr 构造一个空的shared_ptr 将它们强制转换为相同的类型

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 2020-01-02
      • 1970-01-01
      • 2017-04-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2015-08-04
      相关资源
      最近更新 更多