c++ - usar - tipos de funciones en c
Al usar boost:: program_options, ¿cómo se establece el nombre del argumento? (6)
Al utilizar boost::program_options
, ¿cómo configuro el nombre de un argumento para 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;
}
El código anterior da:
--width arg Give width
Lo que quiero es reemplazar el nombre arg
con algo más descriptivo como NUM
:
--width NUM Give width
El enfoque dado por Codebender es el único que puede usar. Esto es realmente intencional: usar "NUM" para el nombre del argumento parece ser una micro-optimización que no vale la pena. Una buena descripción de la opción también debe indicar qué tipo de argumento se espera.
En la versión actual de boost (1.53) ya no necesitas hacer tu propia clase como lo propuso Tim Sylvester. Es posible usar: boost :: program_options :: typed_value. En que value_name se puede configurar.
#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;
}
Mostrará un nombre de argumento configurado:
Usage:
-s [ --some-option ] NUM The option
En versiones recientes de Boost (solo probado para> = 1.61) esto es totalmente compatible. A continuación, una ligera modificación del primer ejemplo en el tutorial, donde se imprime "LEVEL" en lugar de "arg":
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value<int>()->value_name("LEVEL"), "set compression level")
;
La clase program_options::value_semantic
no parametriza el nombre del argumento, por lo que creo que deberás definir tu propia clase. Algo como esto:
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");
Esto debería dar algo como:
--witdh foo give width
Uno puede reemplazar arg
con algo diferente a través de la variable global boost::program_options::arg
:
boost::program_options::arg = "NUM";
Pero como se trata de una variable global, no ayuda mucho solucionar el problema cuando varias opciones pueden requerir diferentes argumentos.
La respuesta de daminetreg funciona, pero puede ser un poco prolija cuando se usa para muchas entradas de opción. Acabo de hackear juntos una sobrecarga para la plantilla value<T>( T* v )
para construir mi value_sematic
s con un value_name
adicional: using
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;
}
puedes crear y agregar una nueva opcion de programa como esta:
int width;
desc.add_options()
("width", boost::program_options::value<int>( &width, "NUM"),
"Give width");
(Nota: esto no aborda todas las demás plantillas de construcción, especialmente el constructor de value()
predeterminado value()
que el OP quiere usar)