我刚刚发现了 bost::property_tree,我真的很喜欢我可以让用户通过编辑配置文件以及在应用程序运行时通过选项更改变量来配置应用程序,并且我能够将更改的配置保存回文件。
我可以简单地加载变量:
int foo = boost::property_tree::get<int>("foo", 5);
并将变量保存回属性树
boost::property_tree::put<int>("foo", foo);
这在简单项目中简单而整洁,但在大型项目中我想:
- 根据程序中变量的当前值保存所有配置
- 当某个绑定变量的生命周期结束时,自动(或者)更新 property_tree 对象。
- 根据要求重新加载属性文件并更新我的程序中的所有值。
不需要一些全局加载/保存函数,这些函数必须包含程序所有需要使用属性值的部分的自定义保存/加载函数(出于明显的原因)。
我可以想象像
class ExtendedPropertyTree : public boost::property_tree
{
.. (some container of bindings) ... binded variables;
void saveAll();
void reload();
...
};
template <class T>
class PropertyBinding
{
...
std::string propertyIdentification;
T& value;
ExtendedPropertyTree& propertyTree;
... // alternatively pointer to before/after update function
... // alternatively default value
... // Constructor/Destructor would register/unregister this instance in the ExtendedProperted Tree automatically
};
还必须定义一些合并冲突的方法(当属性文件重新加载的值在程序和配置文件中发生更改时)。
在这一点上,我觉得,就像我在重新发明轮子一样,有没有办法在不制作这样的自定义类的情况下做到这一点?