2012-04-17 23 views
15

Quiero usar valores predeterminados para algunos de mis argumentos de línea de comandos. ¿Cómo le digo al program_options cuál es la opción predeterminada y, si el usuario no proporciona el argumento, , cómo le digo a mi programa que use el valor predeterminado?¿Cómo obtengo los valores de los argumentos por defecto con las opciones del programa boost?

decir que quiero tener un argumento que especifica el número de robots para enviar en una campaña criminal con un valor por defecto de 3.

robotkill --robots 5 produciría 5 robots have begun the silicon revolution, mientras que robotkill (sin argumentos suministrados) producirían 3 robots have begun the silicon revolution.

+1

La solución a este problema no podría ser más simple, pero no pude encontrarla documentada en ningún lado, así que hice esta pregunta. – flies

+0

Relacionado: cómo saber si el usuario ha proporcionado una opción con un valor predeterminado http://stackoverflow.com/questions/9200598/boost-program-options-with-default-values-always-present-when-using -vm-count ('count' no funciona, aparentemente porque incluso cuando no se proporciona la opción, el mapa variable asignará el valor predeterminado, por lo que el recuento nunca es cero) – flies

+1

http://www.boost.org/doc/ libs/1_65_1/doc/html/boost/program_options/typed_value.html # idp698602832-bb para la descripción técnica y http://www.boost.org/doc/libs/1_65_0/doc/html/program_options/tutorial.html# idp419580960 para la explicación del tutorial relevante. Es cierto que tuve que buscarlos después de usar su respuesta para encontrar el nombre correcto que debe buscar. – patrickvacek

Respuesta

18

program_options asigna automáticamente valores predeterminados a las opciones cuando el usuario no proporciona esas opciones. Ni siquiera necesita verificar si el usuario suministró una opción determinada, solo use la misma asignación en cualquier caso.

#include <iostream> 
#include <boost/program_options.hpp> 

namespace po = boost::program_options; 

int main (int argc, char* argv[]) { 

    po::options_description desc("Usage"); 
    desc.add_options() 
    ("robots", po::value<int>()->default_value(3), 
    "How many robots do you want to send on a murderous rampage?"); 

    po::variables_map opts; 
    po::store(po::parse_command_line(argc, argv, desc), opts); 

    try { 
    po::notify(opts); 
    } catch (std::exception& e) { 
    std::cerr << "Error: " << e.what() << "\n"; 
    return 1; 
    } 

    int nRobots = opts["robots"].as<int>(); 
    // automatically assigns default when option not supplied by user!! 

    std::cout << nRobots << " robots have begun the silicon revolution" 
     << std::endl; 
    return 0; 
} 
Cuestiones relacionadas