Как я только что понял, вы можете определить два взаимоисключающих варианта просто определение небольшая функция, как описано в real.cpp. Например, вы можете указать два противоположных варианта определения 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 + "'.");
}
}
и затем вызвать
conflicting_options (vm, "quiet", "verbose");
сразу после boost::program_options::store()
Проверка, что --myoption
равно myvalue1
или myvalue2
становится просто вопрос вызова функции.
Я все еще не понимаю, можно ли определить два взаимоисключающих позиционных параметра, но это должен быть другой вопрос.
Разве это не просто сравнение строк? Предполагая, что они являются 'std :: string', вы можете сделать' if ((arg == myvalue1) || (arg == myvalue2)) '. –
уверен, что это работает, но мне нужно что-то более интегрированное в 'program-options' (например, оно может изменить справочное сообщение), например, работа с нестрокой –
Возможно, вы захотите больше объяснить, что вы хотите сделать, это неясно. –