2012-07-01 10 views
5

¿Hay una manera simple de verificar si el argumento de una opción está dentro de un conjunto de opciones predefinidas? "Simple" aquí significa sin definir una clase ad-hoc.impulsar opciones de opciones de programas

Supongamos que tengo la opción --myoption que debe tener un valor "myvalue1" o "myvalue2"

Por ejemplo en Python es muy fácil con choices option in optparse

+1

¿No sería esto simplemente la comparación de cadenas? Asumiendo que ambos son 'std :: string', podrías hacer' if ((arg == myvalue1) || (arg == myvalue2)) '. –

+0

seguro, funciona, pero necesito algo más integrado en 'program-options' (por ejemplo, puede cambiar el mensaje de ayuda), por ejemplo, trabajar con cadenas –

+0

. Puede que quiera explicar más sobre lo que quiere hacer, no está claro. –

Respuesta

0

Como he acabo de dar cuenta, se pueden definir dos opciones mutuamente excluyentes, simplemente definiendo una pequeña función como se explica en real.cpp. Por ejemplo, puede especificar dos opciones contradictorias definir una función conflicting_options():

void conflicting_options(const boost::program_options::variables_map & vm, 
         const std::string & opt1, const std::string & opt2) 
{ 
    if (vm.count(opt1) && !vm[opt1].defaulted() && 
     vm.count(opt2) && !vm[opt2].defaulted()) 
    { 
     throw std::logic_error(std::string("Conflicting options '") + 
           opt1 + "' and '" + opt2 + "'."); 
    } 
} 

y luego llamar

conflicting_options (vm, "quiet", "verbose"); 

justo después boost::program_options::store()

comprobando que --myoption es igual a myvalue1 o myvalue2 entonces se convierte en sólo una cuestión de una llamada de función.

Todavía no entiendo si es posible definir dos opciones posicionales mutuamente excluyentes, pero esa debería ser otra pregunta.