Наборы взаимоисключающих опций в настройках форматирования

Моя программа (prog.exe) поддерживает следующие четыре флага: -P, -P, -b и -s. Однако:

  • -b и -P должны быть указаны вместе, составлять набор и иметь числовые значения, например. -b 42
  • -s не может быть указан с указанным выше набором и наоборот
  • -P является обязательным в обоих случаях

Как таковой prog.exe может выполняться только как

prog.exe -P -s 

или

prog.exe -P -b -42 -p 8

Есть ли способ указать вышеупомянутые наборы взаимоисключающих параметров командной строки в настройках форматирования?

Ответы

Ответ 1

Вы должны начать с нескольких учебных пособий [1] [2], чтобы понять, как работает boost::program_options.

Затем вы можете определить два взаимоисключающих параметра, просто определяя небольшую функцию, как описано в 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()

Я все еще не понимаю, возможно ли определить два взаимоисключающих позиционных параметра, но это должен быть другой вопрос.