如何解析配置文件中的布尔选项
How to parse boolean option in config file
使用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);
}
通过使用它,似乎行为是:
- 如果您的选项出现在命令行上,则该选项将替代配置文件
- 如果命令行中没有您的选项,则使用配置文件选项值
在配置文件中log=ON的示例代码中,该选项将始终为ON。如果将其设置为OFF,则只有在使用选项--log运行应用程序时才会启用该选项。
希望这能有所帮助。
我认为目前不允许您尝试执行的操作。程序选项库的作者Vladimir表示
我更改了bool_switch,使其不接受任何参数。这也解决了"arg(=0("输出的问题。
有一个可能的问题。对于命令行,我们很可能不会需要布尔值的显式值。但在配置文件中,值为始终存在。这是我所知道的唯一一个单一选项命令行和其他源的描述有问题--如果如果用boolswitch描述一个选项,则不能在中指定配置文件。
让我们看看这是否有问题。
请注意,这句话已经有近10年的历史了,但在1.55中检查源代码时,我找不到任何证据表明它不再是真的。
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Win32编译器选项和内存分配
- 一个关于在C++中重载布尔运算符的问题
- 提升精神:解析布尔表达式并简化为规范范式
- C/C++预处理器是否可以检测一些编译器选项
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 线程之间的布尔停止信号
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 布尔比较运算符是如何在C++中工作的
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 隐式常量/非常量运算符布尔
- 通过选项卡的文本设置QTabWidget顺序
- 通过ccmake在cmake中缓存依赖选项
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- Android :需要在 c++ NDK 中创建共享首选项对象并存储一些布尔值
- C++设计:具有布尔选项的函数
- 用cout打印出布尔选项
- 如何解析配置文件中的布尔选项