我有用C++編寫的配置文件系統,它使用yaml-cpp庫來解析和寫入YAML文件。我有這個作爲我的靜態庫的一部分。如何在靜態庫中提供默認的YAML配置值?
我希望能夠爲庫的用戶請求的字段(從其代碼調用)返回默認值,但尚未在用戶的YAML文件中定義的字段的默認值。
例如說,用戶要使用該領域foo
從他們的自定義config.yaml
文件:
int bar = config_reader.read<int>("config.yaml", "foo");
如果他們在foo: 10
他們config.yaml
然後bar
將被設置爲10。不過,我也想提供在config.yaml
中省略foo
的情況下的默認值(例如4)。
有我想到了兩種可能性:
有一組在CPP文件中的字段名稱和默認值之間的靜態映射,其被編譯成靜態庫的,但是我需要有不同類型的地圖不同,我覺得這可能會讓類型檢查變得混亂,也許需要模板專門化方法。
有一個YAML文件,其中包含預期字段的所有默認值,如果配置系統無法在用戶的配置文件中找到該字段,則該配置系統將返回該默認值。我認爲這對我來說是首選的解決方案,但我想不出打包這個YAML文件的方式。我寧願用戶在每次建立鏈接靜態庫的新項目時都不必複製或指向此文件。
操作系統與操作系統無關?如果在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