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

C++ 如何解析配置文件中的布尔选项,c++,parsing,ini,boost-program-options,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), *op

使用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()
带或不带
composing()
)在命令行和配置文件中都可以正常工作,只有
bool\u开关()
选项不起作用

知道我做错了什么吗?或者不能将
bool\u开关()
选项与
parse\u config\u file()
一起使用

编辑:

解决方法是将
值()
类型与
默认值()
隐式值()一起使用:

opts->AddOptions()(“foo”,bpo::value()->默认值(false)->隐式值(true),“启用foo”);

我认为目前不允许您尝试这样做。Vladimir,程序选项库的作者

我更改了bool_开关,使其不接受任何参数。 这也解决了“arg(=0)”输出的问题

有一个可能的问题。对于命令行,我们很可能不会 需要布尔值的显式值。但在配置文件中,该值为 总是在场。这是我知道的唯一一个单一选项 命令行和其他源的描述有问题——如果 您使用bool_开关描述了一个选项,不能在中指定它 配置文件

让我们看看这是否是个问题


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

我目前使用的是Boost 1.58,配置文件中对布尔开关选项的支持很好

配置文件(Config.cfg):

代码:

#包括
#包括
#包括
名称空间prog_opts=boost::program_options;
//通知功能
无效选项\u详细(bool opt){

std::cout因此,一个有效的替代方法可能是:
opts->AddOptions()(“foo”,bpo::value()->default_值(false),“Enable foo.”;
可能?这是否仍然允许您在命令行上指定
--foo
?看起来实际的解决方法是这样的(前提是您可以容忍没有“foo”和“foo=false”是相同的)-
opts->AddOptions()(“foo”,bpo::value()->默认值(false)->隐式值(true),“Enable foo”);
它也适用于CentOS 7的默认版本boost 1.53。
opts->AddOptions()("foo", bpo::value<bool>()->default_value(false)->implicit_value(true), "Enable foo.");
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);
}