2009-08-08 22 views
21

boost::program_optionsを使用している場合、boost::program_options::value<>()の引数の名前を設定するにはどうすればよいですか?boost :: program_optionsを使用すると、引数の名前はどのように設定されますか?

#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 

私が欲しいものNUMのようなより説明的なものでarg名前を置き換えることです:

--width NUM   Give width 

答えて

7

最近のバージョンのBoost > = 1.61)これは完全にサポートされています。「LEVEL」の代わりに「引数」と印刷されてチュートリアル、最初の例の若干の変更を下回る:

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

Live Example

3

一つが何か違う経由でargを置き換えることができますグローバル変数 boost::program_options::arg

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

しかし、グローバル変数であるため、複数のオプションが異なる引数を必要とする場合は、問題を解決するのに役立ちません。

9

クラスは引数名をパラメータ化しないため、独自のクラスを定義する必要があります。このような何かを:

--witdh foo give width 
+3

'高めるためのデストラクタ:: program_options :: options_description'は明らかにしようとします'arg'で' free() 'を実行するので、' my_arg_type * arg = new my_arg_type( "foo"); ' – eater

-3

Codebenderによって与えられたアプローチは、使用できる唯一のものです:

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

このような何かを与える必要があります。これは実際には意図的です。引数の名前に「NUM」を使用することは、価値がないマイクロ最適化のようです。オプションの良い説明はまた、どんな種類の議論が期待されるかを述べるべきです。

+5

を"マイクロ最適化 "と呼ぶのはちょっと愚かです。地球上のコマンドラインアプリケーションはそれを行います。私はまだその引数に適切な型または名前を与えていない単一のものを見る必要があります。 – Grumbel

+0

無料ライブラリーの管理者との潜在的な変更について議論するときに使用する正しい用語は「ばかげた」と思いますか? –

+1

peolpeがboost :: program_optionsの中で仮想的なすべてのコマンドラインアプリケーションで使用されている機能が「役に立たない」と教えてくれたらちょっと腹を立てます。 – Grumbel

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

このような「マイクロ最適化」のためのウラジミールの軽蔑のために。 ;-) – DevSolar

+0

Boostには、 "raw"の 'new'を使わずに' value_name() 'を直接呼び出すことができる'値() 'オーバーロードがあります。[my answer](http://stackoverflow.com/questions)/1249646/when-using-boost-program-options-how-does-one-set引数の名前/ 39934452#39934452) – TemplateRex

+0

通知ありがとうございました – daminetreg

0

daminetreg's answer作品を、しかし、オプション項目の多くのために使用された場合、それは少し冗長にすることができます。

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<T>(T* v)テンプレートのオーバーロードが追加value_nameと私のvalue_sematic Sを構築するために一緒にハッキング、これをOPが使用したいデフォルトのvalue()コンストラクタではありません)。

+0

Boost.Program_optionsにはこのオーバーロードがあります。 ](http://stackoverflow.com/questions/1249646/when-using-boostprogram-options-how-does-one-set-the-name-of-the-argument/39934452#39934452)! – TemplateRex

関連する問題