c++ - boost::program_options 位置选项

标签 c++ boost boost-program-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
}

关于c++ - boost::program_options 位置选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061074/

相关文章:

c++ - Xcode header 错误 - 命名空间 '_STL' 未包含命名空间 '_Rep'

C++ 优化破坏 OLE 自动化程序(非 MFC)

c++ - 将自定义类型与 Boost 程序选项一起使用

c++ - 解析位置参数

c++ - 单字节变量的 boost::program_options

c++ - 使用递归的中缀到前缀转换

c++ - 内联无限递归

c++ - 如何向多个线程发送事件信号

c++ - boost::asio::io_service 的 concurrency_hint 是什么意思?

c++ - Boost:两个工作线程,让主线程休眠直到它们都完成