如何解析配置文件中的布尔选项

How to parse boolean option in config file

本文关键字:布尔 选项 何解析 配置文件      更新时间:2023-10-16

使用boost 1_55,我有一个bool_switch((选项,它被定义为:

bpo::options_description opts;
opts->add_options()
    ("foo", bpo::bool_switch(), "Enable foo.");
opts_map = new bpo::variables_map;

它在命令行上被解析为:

bpo::store(bpo::parse_command_line(argc, argv, opts), *opts_map);

在配置文件中也通过以下方式解析:

ifstream ifs("foo.conf");
if (ifs.good()) {
    bpo::store(bpo::parse_config_file(ifs, opts), *opts_map);
    close(ifs);
}

问题是,通过指定或不指定--foo,它在命令行上运行良好,但当我将其放入配置文件时,它总是false(与second.defaulted() == true一起(。我在配置文件中尝试了以下操作:

foo
foo=true
foo=1

其他类型的选项(例如,带或不带composing()bpo::value<ANYTYPE>()(在命令行和配置文件中都可以正常工作,只有bool_switch()选项不起作用。

知道我做错了什么吗?或者您可以不将bool_switch()选项与parse_config_file()一起使用吗?

编辑:

解决方法是将value()类型与default_value()implicit_value():一起使用

opts->AddOptions()("foo", bpo::value<bool>()->default_value(false)->implicit_value(true), "Enable foo.");

我目前正在使用Boost 1.58,并且在配置文件中对布尔开关选项的支持工作得很好。

配置文件(Config.cfg(:

log=ON

代码:

#include <fstream>
#include <boost/program_options.hpp>
#include <iostream>
namespace prog_opts = boost::program_options;
//Notified function
void option_verbose(bool opt) {
  std::cout << "Log ";
  if (opt)
    std::cout << "ON";
  else
    std::cout << "OFF";
  std::cout << "n";
}
int main (int argc, char* argv[]) {
  prog_opts::options_description general("Options");
  general.add_options()
     ("log", prog_opts::bool_switch()->notifier(&option_verbose), "logging")
     ;
  // Assign the CLI args to the map
  prog_opts::variables_map cli_map;
  const prog_opts::basic_parsed_options< char >& cliopts = prog_opts::command_line_parser(argc, argv).options(general).run();
  prog_opts::store(cliopts , cli_map);
  // Get options from config
  std::ifstream infile("config.cfg", std::ifstream::in);
  store(parse_config_file(infile, general), cli_map);
  notify(cli_map);
}

通过使用它,似乎行为是:

  1. 如果您的选项出现在命令行上,则该选项将替代配置文件
  2. 如果命令行中没有您的选项,则使用配置文件选项值

在配置文件中log=ON的示例代码中,该选项将始终为ON。如果将其设置为OFF,则只有在使用选项--log运行应用程序时才会启用该选项。

希望这能有所帮助。

我认为目前不允许您尝试执行的操作。程序选项库的作者Vladimir表示

我更改了bool_switch,使其不接受任何参数。这也解决了"arg(=0("输出的问题。

有一个可能的问题。对于命令行,我们很可能不会需要布尔值的显式值。但在配置文件中,值为始终存在。这是我所知道的唯一一个单一选项命令行和其他源的描述有问题--如果如果用boolswitch描述一个选项,则不能在中指定配置文件。

让我们看看这是否有问题。

请注意,这句话已经有近10年的历史了,但在1.55中检查源代码时,我找不到任何证据表明它不再是真的。