【问题标题】:dynamic configuration with boost program_options使用 boost program_options 进行动态配置
【发布时间】:2010-12-12 23:15:22
【问题描述】:

有没有办法像下面这样加载动态 INI 文件。

[basic]
number_of_servers=3

[server1]
ip=10.20.30.40
password=sdfslkhf    

[server2]
ip=10.20.30.41
password=sdfslkhf

[server3]
ip=10.20.30.42
password=sdfslkhf

这里的想法是这里定义的服务器非常特定于软件的部署;所以管理员决定有多少服务器参与配置。

有没有办法在 boost program_options 中处理这个问题?

【问题讨论】:

  • 您真的将密码存储在配置文件中吗?或者这只是一个微不足道的例子?
  • @Sam;这可能是一个真实的场景;但这是一个例子。您将如何存储服务访问凭据?

标签: c++ configuration boost ini boost-program-options


【解决方案1】:

另一种可能更标准的方式是这样的:

[basic]
number_of_servers=3

[server]
name=server1
ip=10.20.30.40
password=sdfslkhf    

[server]
name=server2
ip=10.20.30.41
password=sdfslkhf

[server]
name=server3
ip=10.20.30.42
password=sdfslkhf

这样您就不必担心未定义的部分名称,而且我认为这种样式也被更广泛地使用(肯定是 QuickFIX 的做法,与我概述的非常相似)。

您可能可以删除number_of_servers 条目,然后使用count() 函数查找有多少server 部分。

【讨论】:

  • 谢谢约翰;我试图这样做,但我似乎无法让它发挥作用。顺便说一句,我找了 QuickFIX,我也找不到任何地方。
  • 你的意思是你似乎无法让它工作?您是否已放弃或提出其他解决方案?你是什​​么意思你找不到QuickFIX?谷歌认为没有问题。
  • 可能我需要花更多的时间来破解它。我最近重做了我的优先事项;这仍然在我的清单上。抱歉我回不来了。在 QuickFIX 上,我确实看到了源代码树,但我看不到那里的 program_options 的用法。
  • 我接受这个不是因为它回答了我的问题,而是它帮助我采取了正确的方法。
  • QuickFIX 不使用 Boost program_options。我的观点是它使用了我写的配置格式。我打算建议您可以使用 Boost 完成与手写代码相同的解析。
【解决方案2】:

有一个可选的bool 参数允许parse_config_file 函数中未注册的条目。默认情况下它设置为 false。请参阅此处的文档:

http://www.boost.org/doc/libs/1_45_0/doc/html/boost/program_options/parse_config_file_id991860.html

如果你用true 调用这个函数,那么它会将所有未注册的条目作为字符串添加到variables_map 中。您可以使用variables_map::count 函数检查它们是否存在。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    当然可以。服务器部分有一个模式:只需将所有匹配模式的部分加载到服务器列表中。

    【讨论】:

    • 谢谢。不知道如何做你的建议。我对 program_options 很陌生。据我所知,在解析配置文件之前,我需要在 options_description 中定义选项。不对吗?
    【解决方案4】:

    解决此问题时我面临的挑战是确保各个部分保持在一起并且不会混淆。

    最后,我依赖于带有已知/有限选项的 options_description,然后使用来自 parse_config_file 的 parsed_options,我必须收集所有无法识别的选项 ( collect_unrecognized )。然后我必须对其进行迭代以按顺序选择选项。

    感谢每一个人的贡献。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多