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
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.