我使用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
};
这是最好的解决方案还是我错过了什么?
答案 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)
这可能是草图:
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;
};