使用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.");
答案 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);
}
从使用它开始,行为似乎是:
在配置文件中log = ON的示例代码中,该选项将始终为ON。将其设置为OFF时,只有在使用选项--log。
运行应用程序时才会启用该选项希望这有帮助。
答案 1 :(得分:1)
我不认为你目前允许做的事情。弗拉基米尔,程序选项库states
的作者我已经更改了bool_switch,因此它不接受任何参数。 这也解决了&#34; arg(= 0)&#34;输出
有一个可能的问题。对于命令行,我们很可能不会 想要bools的显性价值。但是在配置文件中,值是 永远存在。这是我知道单一选项的唯一情况 命令行和其他来源的描述是有问题的 - 如果 你用bool_switch描述一个选项,它不能被指定 配置文件。
让我们看看这是不是一个问题。
请注意,此声明已有近10年的历史,但在1.55中检查源代码时,我无法找到任何证据。