yaml-cppライブラリを使ってYAMLファイルを解析して書き込む、C++で書かれた構成ファイルシステムがあります。私は静的ライブラリの一部としてこれを持っています。静的ライブラリにデフォルトのYAML設定値をどのように提供しますか?
私は、ライブラリのユーザから要求された(コードから呼び出す)フィールドのデフォルト値を返すことができますが、ユーザのYAMLファイルでは定義されていません。彼らはconfig.yaml
でfoo: 10
を持っている場合は、bar
は私も提供したいと思いますが10に設定されます
int bar = config_reader.read<int>("config.yaml", "foo");
:たとえば
は、ユーザーが自分のカスタムconfig.yaml
ファイルからフィールドfoo
を使用したいと言いますfoo
がconfig.yaml
から省略された場合のデフォルト値(たとえば4)。
私が考えている二つの可能性があります。
は、静的ライブラリにコンパイルされるのcppファイル内のフィールド名とデフォルト値の間の静的マップのセットを持っている、しかし、私が持っている必要がありますさまざまなタイプのマップが違っていて、タイプチェックやテンプレートの特殊化メソッドが必要になることがあります。
予想されるフィールドのデフォルト値のすべてを含むYAMLファイルがあります。このファイルは、ユーザーの設定ファイルでフィールドが見つからない場合、設定システムが元に戻ります。私はこれが私にとっては好ましい解決策だと思いますが、このYAMLファイルを綺麗にパッケージ化する方法は考えられません。むしろ、静的ライブラリをリンクする新しいプロジェクトを設定するたびに、このファイルをコピーまたはポイントする必要はありませんでした。
このOSは独立していますか? Linuxでは '/ etc/default/YOURLIBNAME.yaml'にデフォルトを置き、' $ XDG_CONFIG_HOME/YOURLIBNAME/config.yaml'や(XDG_CONFIG_HOMEが設定されていない場合は '$ HOME/YOURLIBNAME/config.yaml')の値で上書きします。グローバルコンフィグレーションファイルから 'foo'フィールドを削除するとエラーになります。 Windows上で '%APPDATA% 'を使用する必要がある場合は – Anthon
はい、LInuxシステム用です。 これは非常に意味があり、実装するのに十分簡単です。ありがとう! –
XDG_CONFIG_HOMEが設定されていない場合の代替方法は、 '$ HOME/.config/YOURLIBNAME/config.yaml'です(私は' .config'を忘れています)。私はこれを答えにする必要がありますか? – Anthon