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.
¿No sería esto simplemente la comparación de cadenas? Asumiendo que ambos son 'std :: string', podrías hacer' if ((arg == myvalue1) || (arg == myvalue2)) '. –
seguro, funciona, pero necesito algo más integrado en 'program-options' (por ejemplo, puede cambiar el mensaje de ayuda), por ejemplo, trabajar con cadenas –
. Puede que quiera explicar más sobre lo que quiere hacer, no está claro. –