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

How do I provide default YAML configuration values in a static library?

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

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

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

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

如果他们的 config.yaml 中有 foo: 10 那么 bar 将被设置为 10。但是我也想在这种情况下提供一个默认值(例如 4) config.yaml.

中省略了 foo

我想到了两种可能:

  1. 在编译成静态库的 cpp 文件中有一组字段名称和默认值之间的静态映射,但是我需要为不同的类型准备不同的映射,我觉得这可以弄乱类型检查,可能需要模板专门化方法。

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

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

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

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