代码之家  ›  专栏  ›  技术社区  ›  Stewart

移动boost::property_tree::ptree的构造函数

  •  3
  • Stewart  · 技术社区  · 6 年前

    我用 boost::property_tree::ptree 相当多,但我发现我创建、传递和保存副本的次数太多了。大的 ptree 物品这很贵。

    boost提供了 swap 函数,但没有移动构造函数。他们为什么要这么做?

    我现在的解决方案是扩展ptree并自己制作一个:

    class MyPtree : public boost::property_tree::ptree
    {
      MyPtree(MyPtree&& other)
      {
        swap(other);
      }
    
      ... plus adding the other constructors and operators
    };
    

    这是最好的解决方案还是我遗漏了什么?

    3 回复  |  直到 6 年前
        1
  •  2
  •   sehe    6 年前

    我认为你的解决方案相当不错。注意,它永远不会影响内部树操作,因为树将其子级视为 ptree 不是 MyPtree .

    稍微好一点的做法是提出新特性并将其推荐给de-library开发人员。


    相关IS Is there a convenient way to erase a node from a property tree, preserving its child nodes? .

    如果您想深入研究,您会发现属性树构建在boost multiindex之上,出于各种原因,它似乎不允许从值移动: Move element from boost multi_index array

    你可以加一个 splice() 根据所使用的各种索引列表进行操作:

    目前,ptree可以添加一个拼接操作,这将自然地包装 multi_index's list operations :我刚做了一个 draft implementation sehe - Sep 23 '17 at 9:48

        2
  •  1
  •   elarmando    6 年前

    Stewart,我见过ptree析构函数,它似乎不是虚拟的。这意味着如果myptree是多态使用的,则不会调用基析构函数(ptree)。也许你应该考虑使用组合而不是继承。 See this answer enter image description here

    这可能是个草图:

    class MyPtree
    {
       boost::property_tree::ptree m_tree;
    
       MyPtree(MyPtree&& other)
       {
          m_tree.swap(other.m_tree);
       }
    
      ... plus adding the other constructors and operators
    };
    
        3
  •  0
  •   Suren Verdiyan    6 年前

    使用组合代替继承

    class MyPtree
    {
    public:
      MyPtree():{m_tree_ptr = new boost::property_tree::ptree();
      MyPtree(MyPtree&& other){m_tree_ptr = other.m_tree_ptr; other.m_tree_ptr = nullptr;}
      ~MyPtree(){if (m_tree_ptr != nullptr) delete m_tree_ptr;}
      // copy conctructor and assign operator
    
    private:
     boost::property_tree::ptree* m_tree_ptr;
    };