boost :: program_options是否可以使用这种可重复的选项?

时间:2016-05-01 23:24:46

标签: c++ boost boost-program-options

我有选项--foo(简称-f)和--bar,需要特殊处理,它们是可重复的,顺序也很重要。因此,对于以下内容:

program --foo 1 --z -f 2 --bar 3 --x --foo 4

我希望能够构建一个能够构建[("foo", 1), ("foo", 2), ("bar", 3), ("foo", 4)]的键值映射。

请注意这个元组数组的顺序,它与命令行中的顺序相同。我已经丢弃了数组中的非重要选项,但它们可能仍然存在于命令行中。

似乎允许使用boost::program_options的可重复选项的唯一方法是为任何给定选项调用composing(),但是,由于每个选项都会将所有值存储在向量中,因此我失去了我需要的顺序隔行扫描选项。

那么,boost::program_options可以帮助解决这个问题吗?

修改

我在这里要求提供替代软件建议:https://softwarerecs.stackexchange.com/questions/31766/

用Poco回答。

1 个答案:

答案 0 :(得分:0)

假设您可以接受在--foo和值之间放置一个等号,这可能会做你想要的:

#include <iostream>
#include <boost/program_options.hpp>
#include <vector>
#include <iterator>
#include <algorithm>

int main(int argc, const char**argv)
{
    std::vector<int> foos;
    boost::program_options::options_description desc("Command Line Options");
    desc.add_options()
    ("foo,F", boost::program_options::value(&foos)->multitoken(), "integers for foo");


    std::cout << desc << std::endl;

    boost::program_options::variables_map vm;
    boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
    boost::program_options::notify(vm);

    std::copy(foos.begin(), foos.end(), std::ostream_iterator<int>(std::cout, ", "));
    std::cout << std::endl;
    return 0;
}
用命令行调用

./a.out --foo=1 --foo=2

的产率:

Command Line Options:
  -F [ --foo ] arg      integers for foo

1, 2,