繁体   English   中英

使用boost :: program_options时,如何设置参数的名称?

[英]When using boost::program_options, how does one set the name of the argument?

使用boost::program_options ,如何为boost::program_options::value<>()设置参数名称?

#include <iostream>
#include <boost/program_options.hpp>

int main()
{
  boost::program_options::options_description desc;

  desc.add_options()
    ("width", boost::program_options::value<int>(),
     "Give width");

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

  return 0;
}

上面的代码给出:

  --width arg           Give width

我想是更换arg与更具描述性的名称一样NUM

  --width NUM           Give width

program_options::value_semantic类没有参数化参数名称,所以我认为你必须定义自己的类。 像这样的东西:

struct my_arg_type
    : public boost::program_options::typed_value<int>
{
    my_arg_type(std::string const& name)
        : boost::program_options::typed_value<int>(&my_value)
        , my_name(name)
        , my_value(0)
    {
    }
    std::string name() const { return my_name; }
    std::string my_name;
    int my_value;
};

boost::program_options::options_description desc;

my_arg_type arg("foo");
desc.add_options()
    ("width", &arg, "give width");

这应该是这样的:

--witdh foo    give width

在当前版本的boost(1.53)中,您不再需要像Tim Sylvester提出的那样创建自己的类。 可以使用:boost :: program_options :: typed_value。 可以配置value_name。

#include <iostream>
#include <boost/program_options.hpp>
using boost::program_options::typed_value;
using boost::program_options::options_description;

int main(int argc, char **argv) {
    options_description desc("Usage");

    int someValue;
    auto someOption = new typed_value<decltype(someValue)>(&someValue);
    someOption->value_name("NUM");
    desc.add_options()
        ("some-option,s", someOption, "The option\n");

    std::cout << desc << std::endl;
    return 0;
}

将显示已配置的参数名称:

Usage:
-s [ --some-option ] NUM The option

在Boost的最新版本中(仅测试> = 1.61),这是完全支持的。 下面是对教程中第一个示例的略微修改,其中打印了“LEVEL”而不是“arg”:

po::options_description desc("Allowed options");
desc.add_options()
    ("help", "produce help message")
    ("compression", po::value<int>()->value_name("LEVEL"), "set compression level")
;

实例

一个可以取代arg通过全局变量不同的东西boost::program_options::arg

boost::program_options::arg = "NUM";

但由于这是一个全局变量,当多个选项可能需要不同的参数时,解决问题并没有多大帮助。

daminetreg的答案有效,但当用于许多选项时,它可能有点冗长。 我只黑客在一起的过载的value<T>( T* v )模板以构建我value_sematic s的一个额外的value_name :使用

template<class T>
typed_value<T>*
value(T* v, const char * value_typename)
{
    typed_value<T>* r = new typed_value<T>(v);
    r->value_name( value_typename );

    return r;        
}

你可以像这样创建和添加一个新的program_option:

int width;
desc.add_options()
    ("width", boost::program_options::value<int>( &width, "NUM"),
     "Give width");

(注意:这不会解决所有其他构造模板,尤其不是OP想要使用的默认value()构造函数)

Codebender给出的方法是唯一可以使用的方法。 这实际上是有意的 - 使用“NUM”作为参数名称似乎是微观优化,这是不值得做的。 对期权的一个很好的描述也应该说明期待什么样的论证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM