24

使用时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
4

6 回答 6

12

在最近的 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")
;

现场示例

于 2016-10-08T16:02:49.317 回答
9

该类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
于 2009-08-08T20:04:18.073 回答
8

在当前版本的 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
于 2013-04-24T07:30:35.727 回答
3

arg可以通过全局变量 替换为不同的东西boost::program_options::arg

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

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

于 2009-08-08T19:19:57.100 回答
0

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");

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

于 2014-02-10T13:38:32.337 回答
-3

Codebender 提供的方法是您唯一可以使用的方法。这实际上是有意的——使用“NUM”作为参数名称似乎是不值得做的微优化。对选项的良好描述还应该说明预期的参数类型。

于 2009-08-10T07:33:15.183 回答