2011-05-04 16 views
14

Parece que no puedo leer desde el archivo de configuración opciones de multitoken como puedo desde la línea de comandos. ¿Cuál es la sintaxis para el archivo de configuración?boost :: program_options opción de archivo de configuración con varios tokens

Esto es cómo se añade la descripción de la opción:

//parser.cpp 
- - - 
po::options_description* generic; 
generic=new po::options_description("Generic options"); 
generic->add_options() 
("coordinate",po::value<std::vector<double> >()->multitoken(),"Coordinates (x,y)"); 

Después de lo cual me analizo mando y config-archivos.

En la línea de comandos '--coordinate 1 2' funciona. Sin embargo, cuando intento en el archivo de configuración:

coordinate = 1,2 

o

coordinate= 1 2 

no logra dar una excepción invalid_option_value. Entonces, ¿qué es exactamente la sintaxis de los archivos de configuración en el caso de las opciones multitoken?

+1

que no es necesario usar 'new' aquí. Si lo hace, corre el riesgo de tener pérdidas de memoria. –

Respuesta

6

Puede lograr el comportamiento que busca escribiendo un validador personalizado. Este validador personalizado acepta:

./progname --coordinate 1 2 
./progname --coordinate "1 2" 
#In config file: 
coordinate= 1 2 

Aquí está el código:

struct coordinate { 
    double x,y; 
}; 

void validate(boost::any& v, 
    const vector<string>& values, 
    coordinate*, int) { 
    coordinate c; 
    vector<double> dvalues; 
    for(vector<string>::const_iterator it = values.begin(); 
    it != values.end(); 
    ++it) { 
    stringstream ss(*it); 
    copy(istream_iterator<double>(ss), istream_iterator<double>(), 
     back_inserter(dvalues)); 
    if(!ss.eof()) { 
     throw po::validation_error("Invalid coordinate specification"); 
    } 
    } 
    if(dvalues.size() != 2) { 
    throw po::validation_error("Invalid coordinate specification"); 
    } 
    c.x = dvalues[0]; 
    c.y = dvalues[1]; 
    v = c; 
} 
... 
    po::options_description config("Configuration"); 
    config.add_options() 
     ("coordinate",po::value<coordinate>()->multitoken(),"Coordinates (x,y)") 
     ; 

Referencias:

8

En su archivo de configuración, coloque cada elemento de su vector en una línea diferente.

coordinate=1 
coordinate=2 
+0

Funciona a la perfección – kshahar

0

Durante la búsqueda de mí mismo confrontado con un problema similar, que tomó el código anterior de la respuesta de Rob (desde el 4 de mayo de 2011), pero tuvo que cambiar algunas cosas debido a cambios en la arquitectura de impulso y C++ 11. Solo cito las partes que cambié (o que habría cambiado). El resto que no está dentro de la función de validación se mantiene igual. Por razones de conformidad, agregué los prefijos std :: necesarios.

namespace po = boost::program_options; 

void validate(boost::any& v, 
    const std::vector<std::string>& values, 
    coordinate*, int) { 
    coordinate c; 
    std::vector<double> dvalues; 
    for(const auto& val : values) { 
    std::stringstream ss(val); 
    std::copy(std::istream_iterator<double>(ss), std::istream_iterator<double>(), 
     std::back_inserter(dvalues)); 
    if(!ss.eof()) { 
     throw po::invalid_option_value("Invalid coordinate specification"); 
    } 
    } 
    if(dvalues.size() != 2) { 
    throw po::invalid_option_value("Invalid coordinate specification"); 
    } 
    c.x = dvalues[0]; 
    c.y = dvalues[1]; 
    v = c; 
} 

El cambio de po :: VALIDATION_ERROR a po :: invalid_option_value fue insinuado en https://stackoverflow.com/a/12186109/4579106

Cuestiones relacionadas