如何在静态库中提供默认的YAML配置值?

时间:2016-09-28 08:51:21

标签: c++ configuration yaml default default-value

我有一个用C ++编写的配置文件系统,它使用yaml-cpp库来解析和写入YAML文件。我把它作为静态库的一部分。

我希望能够返回库用户请求的字段的默认值(从他们的代码调用),但是尚未在用户的YAML文件中定义。

例如,假设用户想要使用其自定义foo文件中的字段config.yaml

int bar = config_reader.read<int>( "config.yaml", "foo" );

如果他们foo: 10中有config.yaml,则bar将设置为10.但是,如果{我还要提供默认值(例如4) {1}}中省略了{1}}。

我想到了两种可能性:

  1. cpp文件中的字段名称和默认值之间有一组静态映射,它们被编译到静态库中,但是我需要为不同的类型提供不同的映射,我觉得这可能会因类型而变得混乱检查并可能需要模板专业化方法。

  2. 有一个YAML文件,其中包含预期字段的所有默认值,如果配置系统无法在用户的配置文件中找到该字段,则该配置文件将重新开启。我认为这对我来说是首选的解决方案,但我想不出这种YAML文件打包的简洁方法。我希望用户每次设置链接静态库的新项目时都不必复制或指向此文件。

1 个答案:

答案 0 :(得分:1)

我会在全局(即非用户特定位置)的YAML文件中提供默认值,并允许使用特定于用户的值覆盖这些值。 如果全局默认值缺少一个条目,请考虑抛出错误,这不会偶然发生。

您可以放入/etc/default/YOUBLIBNAME.yaml的全局默认值。现在用户的配置主要遵循XDG基目录规范。对于该用途$XDG_CONFIG_HOME/YOURLIBNAME/config.yaml如果在环境中设置了XDG_CONFIG_HOME,则如果未设置则使用$HOME/.config/YOURLIBNAME/config.yaml

如果您的图书馆必须在Windows下工作,我会将%APPDATA%下的用户特定数据放在子文件YOURBLINAME中。