Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost程序选项中的向量参数_C++_Boost_Boost Program Options - Fatal编程技术网

C++ Boost程序选项中的向量参数

C++ Boost程序选项中的向量参数,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我有两个相关的问题: 使用Boost程序选项传递一系列值的最简单方法是什么?我的目标是避免使用prog--opt 1--opt 2--opt 3,而是使用prog--opt 1 2 3 有一个只接受两个数字的选项最简单的方法是什么,例如,prog--opt 137 42 (我不需要任何“免费”程序参数。)对于第一部分,这应该可以工作 namespace po = boost::program_options; po::option_descriptions desc(""); desc.add

我有两个相关的问题:

  • 使用Boost程序选项传递一系列值的最简单方法是什么?我的目标是避免使用
    prog--opt 1--opt 2--opt 3
    ,而是使用
    prog--opt 1 2 3

  • 有一个只接受两个数字的选项最简单的方法是什么,例如,
    prog--opt 137 42


  • (我不需要任何“免费”程序参数。)

    对于第一部分,这应该可以工作

    namespace po = boost::program_options;
    po::option_descriptions desc("");
    
    desc.add_options()
     ("opt", po::value<std::vector<int> >()->multitoken(), "description");
    
    这需要伴随着

    template< typename T >
    fixed_tokens_typed_value< T > 
    fixed_tokens_value(unsigned min, unsigned max) {
        return fixed_tokens_typed_value< T >(0, min, max ); }
    
    template< typename T >
    fixed_tokens_typed_value< T > 
    fixed_tokens_value(T * t, unsigned min, unsigned max) {
        fixed_tokens_typed_value< T >* r = new
                       fixed_tokens_typed_value< T >(t, min, max);
        return r; }
    
    模板
    固定\u令牌\u类型\u值
    固定\u令牌\u值(无符号最小值、无符号最大值){
    返回固定的_标记_类型的_值(0,最小,最大);}
    模板
    固定\u令牌\u类型\u值
    固定令牌值(T*T、无符号最小值、无符号最大值){
    固定\u令牌\u类型\u值*r=new
    固定令牌类型值(T,min,max);
    返回r;}
    
    然后

    desc.添加选项()
    (“opt”,po::固定代币价值(2,2),“说明”);
    

    应该有用。我还没有机会测试它,所以它可能包含一些bug。但是,至少应该让你知道你需要什么。

    这是一个迟来的答案,但我希望它能帮助别人。您可以轻松地在第#1项中使用相同的技术,但需要对向量中的项目数添加另一个验证:

    根据rcollyer的例子:

    namespace po = boost::program_options;
    po::option_descriptions desc("");
    
    desc.add_options()
     ("opt", po::value<std::vector<int> >()->multitoken(), "description");
    
    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm); 
    
    vector<int> opts;
    if (!vm["opt"].empty() && (opts = vm["opt"].as<vector<int> >()).size() == 2) {
      // good to go
    }
    
    namespace po=boost::program\u选项;
    po::选项描述描述(“”);
    说明添加选项()
    (“opt”,po::value()->multitoken(),“description”);
    变量映射虚拟机;
    po::store(po::parse_命令行(argc、argv、desc)、vm);
    po::通知(vm);
    矢量选择;
    如果(!vm[“opt”].empty()&&(opts=vm[“opt”].as()).size()=2){
    //很好
    }
    
    @Szabolcs,这段代码的一个有趣之处是,默认情况下需要使用向量。否则,您将如何存储这些值?因此,我认为应该将
    po::typed_value
    更改为
    po::typed_value,charT>
    。这是否也适用于
    std::array
    std::list
    而不是vectors?@einpoklum我不明白为什么不适用。但是,我认为
    std::array
    会有点棘手,因为我不知道用于插入容器的内容,尽管这可能是可配置的,并且它的固定大小需要一些调整。相比之下,
    std::list
    没有这些限制,因此我怀疑您可以使用它作为替代品。如果按照C++11标准进行编码,您可以再次删除该空间,这是官方支持的(并且在任何主要的编译器中,例如gcc>=4.6)。几年来,VC一直将此作为一种特殊的扩展。
    desc.add_options()
     ("opt", po::fixed_tokens_value<std::vector<int> >(2,2), "description");
    
    namespace po = boost::program_options;
    po::option_descriptions desc("");
    
    desc.add_options()
     ("opt", po::value<std::vector<int> >()->multitoken(), "description");
    
    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm); 
    
    vector<int> opts;
    if (!vm["opt"].empty() && (opts = vm["opt"].as<vector<int> >()).size() == 2) {
      // good to go
    }