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
};
コンフリクトをマージする何らかの方法 (プロパティ ファイルによって再ロードされる値がプログラムと構成ファイルで変更された場合) も定義する必要があります。
この時点で、車輪を再発明しているように感じますが、このようなカスタムクラスを作成せずにそれを行う方法はありますか?