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

Gru*_*bel 22 c++ boost boost-program-options

使用时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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出:

  --width arg           Give width
Run Code Online (Sandbox Code Playgroud)

我想要的是arg用更具描述性的名称替换名称NUM:

  --width NUM           Give width
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 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");
Run Code Online (Sandbox Code Playgroud)

这应该是这样的:

--witdh foo    give width
Run Code Online (Sandbox Code Playgroud)

  • `boost :: program_options :: options_description`的析构函数显然试图在`arg`上执行`free()`,所以我不得不做`my_arg_type*arg = new my_arg_type("foo");` (3认同)

dam*_*reg 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Usage:
-s [ --some-option ] NUM The option
Run Code Online (Sandbox Code Playgroud)

  • 弗拉基米尔对这种"微观优化"的蔑视让他感到非常不满.;-) (2认同)

Tem*_*Rex 8

在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")
;
Run Code Online (Sandbox Code Playgroud)

实例