使用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
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:8)
在Boost的最新版本中(仅测试&gt; = 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")
;
答案 3 :(得分:3)
可以通过全局变量用不同的东西替换arg
boost::program_options::arg
:
boost::program_options::arg = "NUM";
但由于这是一个全局变量,当多个选项可能需要不同的参数时,解决问题并没有多大帮助。
答案 4 :(得分:0)
daminetreg's answer有效,但在用于大量选项时可能会有点冗长。我刚刚攻击了value<T>( T* v )
模板的重载,以构建我的value_sematic
并添加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()
构造函数)
答案 5 :(得分:-3)
Codebender提供的方法是您唯一可以使用的方法。这实际上是有意的 - 使用“NUM”作为参数名称似乎是微观优化,这是不值得做的。对选项的一个很好的描述也应该说明期待什么样的论点。