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 でのみテスト済み) では、これは完全にサポートされています。チュートリアルの最初の例を少し変更すると、「arg」の代わりに「LEVEL」が出力されます。

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

ブーストの現在のバージョン (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 )テンプレートのオーバーロードをハックして、追加の: using を使用してvalue_sematicsを構築しました。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 に答える