【发布时间】:2021-01-08 03:17:58
【问题描述】:
我想编写一个解析配置文件的程序,并允许命令行覆盖那里写的内容。所以我可以有一个配置文件,上面写着:
[section1]
opt1=42
[section2]
opt2=17
然后,我可以使用以下命令运行命令:
./so --opt2=3
程序会得到opt1 为42 和opt2 和3。我使用下面的程序来尝试这样做:
#include <fstream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char *argv[]) {
po::options_description options1("section1");
options1.add_options()
("opt1", po::value<int>(), "Option 1");
po::options_description options2("section2");
options2.add_options()
("opt2", po::value<int>(), "Option 2");
po::options_description options;
options.add(options1);
options.add(options2);
po::variables_map values;
po::store( po::command_line_parser( argc, argv ).options(options).run(), values );
std::ifstream iniFile( "options.ini" );
po::store(
parse_config_file( iniFile, options ),
values );
}
这当然行不通。 Boost::program_options 想要将section1 下的opt1 称为section1.opt1。但是,如果我这样做,我的程序会在两个方面变得更难维护:
- 我需要定义两个
options_descriptions,一个用于INI,一个用于命令行。 - 由于选项的键现在不同,我需要手动合并两者。
有没有办法在不手动工作的情况下实现这一点?
【问题讨论】:
标签: c++ boost boost-program-options