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

时间:2018-05-31 14:47:35

标签: c++ boost

我使用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 个答案:

答案 0 :(得分:2)

我认为你的解决方案非常不错。请注意,它永远不会影响内部树操作,因为树会将其子项视为ptree,而不是MyPtree

稍微好一点的是提出新功能并建议de library devs。

相关的是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

答案 1 :(得分:1)

斯图尔特,我已经看过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
};

答案 2 :(得分:0)

使用合成代替继承

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;
};