C++ 如何解析配置文件中的布尔选项
使用boost 1_55,我有一个bool_switch()选项,定义如下: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
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);
}