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

时间:2014-07-11 15:39:39

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

使用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

其他类型的选项(例如bpo::value<ANYTYPE>()有或没有composing())在命令行和配置文件中都可正常工作,只有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.");

2 个答案:

答案 0 :(得分:2)

我目前正在使用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. 如果命令行中没有您的选项,则使用配置文件选项值。
  3. 在配置文件中log = ON的示例代码中,该选项将始终为ON。将其设置为OFF时,只有在使用选项--log。

    运行应用程序时才会启用该选项

    希望这有帮助。

答案 1 :(得分:1)

我不认为你目前允许做的事情。弗拉基米尔,程序选项库states

的作者
  

我已经更改了bool_switch,因此它不接受任何参数。   这也解决了&#34; arg(= 0)&#34;输出

     

有一个可能的问题。对于命令行,我们很可能不会   想要bools的显性价值。但是在配置文件中,值是   永远存在。这是我知道单一选项的唯一情况   命令行和其他来源的描述是有问题的 - 如果   你用bool_switch描述一个选项,它不能被指定   配置文件。

     

让我们看看这是不是一个问题。

请注意,此声明已有近10年的历史,但在1.55中检查源代码时,我无法找到任何证据。