boost::program_options位置选项
boost::program_options positional options
我有一个位置选项(文件名),我希望它是最后一个选项。用户可以在命令行上传递一堆东西,也可以使用-F
作为文件名。但是,我希望用户也能够将文件名放在末尾。
例如:
./program --var 3 /path/to/file
我目前实现的代码允许调用者将文件名放在命令行的任何位置。有没有什么方法可以强迫位置论点总是在"常规"论点之后?
以下是我如何设置位置论点:
pos_opts_desc.add("filename", -1);
解析命令行:
store(
command_line_parser(argc, argv).options(opts_desc).positional(pos_opts_desc).run(),
opts_var_map);
提前感谢您的帮助。
编辑后添加:
我完全同意在命令行的任何位置指定-F
。但是,如果设置是通过位置选项完成的,我希望确保位置选项在最后。
run()
成员函数返回一个类型为parsed_options
的实例。简单的用法是永远不要实际查看这个对象,并将其直接传递到store()
中,如您的示例所示:
po::store(
po::command_line_parser(argc, argv).options(opts_desc).positional(pos_opts_desc).run(),
opts_var_map);
但我们可以抓住它并检查它的内容:
auto parsed = po::command_line_parser(argc, argv)
.options(opts_desc)
.positional(pos_opts_desc)
.run();
po::store(parsed, opts_var_map);
parsed_options
类有一个成员options
,它有一个所有选项的有序列表(与按选项名称排序的变量映射不同,因为它是std::map
)。因此,您可以查找"filename"
参数并检查其position_key
成员。我们想要:position_key == -1
(这意味着它提供了-F
)或position_key == 0
,并且它是选项列表中的最后一个元素(它是最后一个参数的位置参数):
auto it = std::find_if(parsed.options.begin(),
parsed.options.end(),
[](po::option const& o) {
return o.string_key == "filename";
});
if (it == parsed.options.end()) {
// fail: missing filename);
}
if (it->position_key != -1 && it != std::prev(parsed.options.end())) {
// fail: filename was positional but wasn't last
}
variables_map
顾名思义就是std::map
,它允许我们在其上使用常规STL函数。
if ( vm.count("filename") ) {
if ( vm.find("filename") != std::prev(vm.rbegin()).base() ) {
std::cout << "filename must go at the end.";
}
}
测试用例:
g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp -lboost_system -lboost_program_options
&& echo -n "Case 1 " && ./a.out asdf --foo=12 && echo
&& echo -n "Case 2 " && ./a.out --foo=12 asdf && echo
&& echo -n "Case 3 " && ./a.out asdf && echo
&& echo -n "Case 4 " && ./a.out --foo=12 && echo
&& echo -n "Case 5 " && ./a.out && echo
&& echo -n "Case 6 " && ./a.out --foo=12 asdf asdf
结果:
Case 1 filename must go at the end.
Case 2
Case 3
Case 4
Case 5
Case 6 option '--filename' cannot be specified more than once
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Win32编译器选项和内存分配
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 提升::P设置选项无法使所有参数都处于位置状态
- 我无法使用位置选项仿真子命令,然后再进行Unregistered_options
- boost::program_options位置选项
- 如何避免在 boost::p rogram_options 中将位置选项指定为"regular"选项?
- 按位置查找未标记的模板选项/参数/参数
- Boost:无法识别的位置参数选项
- 如何添加描述来提升::p rogram_options的位置选项?
- 具有隐式值的Boost程序选项错误地获取位置选项的值