Lorsque boost :: program_options est utilisé, comment définit-on le nom de l’argument?

Lorsque j’utilise boost::program_options , comment définir le nom d’un argument pour boost::program_options::value() ?

 #include  #include  int main() { boost::program_options::options_description desc; desc.add_options() ("width", boost::program_options::value(), "Give width"); std::cout << desc << std::endl; return 0; } 

Le code ci-dessus donne:

  --width arg Give width 

Ce que je veux, c’est remplacer le nom de l’ arg par quelque chose de plus descriptif, comme NUM :

  --width NUM Give width 

Dans les versions récentes de Boost (uniquement testé pour> = 1.61), cela est entièrement pris en charge. Ci-dessous une légère modification du premier exemple du tutoriel, où “LEVEL” est imprimé à la place de “arg”:

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

Exemple en direct

La classe program_options::value_semantic ne paramètre pas le nom de l’argument, je pense donc que vous devrez définir votre propre classe. Quelque chose comme ça:

 struct my_arg_type : public boost::program_options::typed_value { my_arg_type(std::ssortingng const& name) : boost::program_options::typed_value(&my_value) , my_name(name) , my_value(0) { } std::ssortingng name() const { return my_name; } std::ssortingng my_name; int my_value; }; boost::program_options::options_description desc; my_arg_type arg("foo"); desc.add_options() ("width", &arg, "give width"); 

Cela devrait donner quelque chose comme:

 --witdh foo give width 

Dans la version actuelle de boost (1.53), vous n’avez plus besoin de créer votre propre classe comme l’a proposé Tim Sylvester. Il est possible d’utiliser: boost :: program_options :: typed_value. Sur quel valeur_nom peut être configuré.

 #include  #include  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(&someValue); someOption->value_name("NUM"); desc.add_options() ("some-option,s", someOption, "The option\n"); std::cout << desc << std::endl; return 0; } 

Affiche un nom d'argument configuré:

 Usage: -s [ --some-option ] NUM The option 

On peut remplacer arg par autre chose avec la variable globale boost::program_options::arg :

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

Mais comme il s’agit d’une variable globale, il n’aide pas beaucoup à résoudre le problème lorsque plusieurs options peuvent nécessiter des arguments différents.

La réponse de daminetreg fonctionne, mais elle peut être un peu verbeuse lorsqu’elle est utilisée pour de nombreuses entrées d’options. Je viens de pirater ensemble une surcharge pour le modèle de value( T* v ) afin de construire mes value_sematic avec un nom de valeur supplémentaire: using

 template typed_value* value(T* v, const char * value_typename) { typed_value* r = new typed_value(v); r->value_name( value_typename ); return r; } 

vous pouvez créer et append un nouveau programme_option comme ceci:

 int width; desc.add_options() ("width", boost::program_options::value( &width, "NUM"), "Give width"); 

(Remarque: cela ne concerne pas tous les autres modèles de construction, en particulier le constructeur value() par défaut que l’OP souhaite utiliser)

L’approche donnée par Codebender est la seule que vous puissiez utiliser. C’est en fait intentionnel – utiliser “NUM” pour le nom de l’argument semble être une micro-optimisation qui ne vaut pas la peine d’être faite. Une bonne description de l’option devrait également indiquer le type d’argument attendu.