Параметры с и без аргументов в повышении:: program_options

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

dc-ctl --brightness 15

и "добираются, режим" был бы:

dc-ctl --brightness
brightness=15

Проблема, я не знаю, как обработать второй случай, не ловя это исключение:

error: required parameter is missing in 'brightness'

Существует ли простой способ постараться не иметь его, бросают ту ошибку? Это происходит, как только аргументы анализируются.

7
задан tmatth 8 February 2010 в 18:53
поделиться

1 ответ

Я получил частичное решение от Как принять пустое значение в boost :: program_options , который предлагает использовать метод implicit_value для тех параметров, которые могут иметь или не иметь присутствуют аргументы. Итак, мой вызов для инициализации параметра "яркости" выглядит так:

 ("brightness,b", po::value<string>()->implicit_value(""),

Затем я перебираю карту переменных и для любого аргумента, являющегося строкой, проверяю, пусто ли оно, и если да, то печатаю текущее значение. Этот код выглядит следующим образом:

    // check if we're just printing a feature's current value
    bool gotFeature = false;
    for (po::variables_map::iterator iter = vm.begin(); iter != vm.end(); ++iter)
    {
        /// parameter has been given with no value
        if (iter->second.value().type() == typeid(string))
            if (iter->second.as<string>().empty())
            {
                gotFeature = true;
                printFeatureValue(iter->first, camera);
            }
    }

    // this is all we're supposed to do, time to exit
    if (gotFeature)
    {
        cleanup(dc1394, camera, cameras);
        return 0;
    }

ОБНОВЛЕНИЕ: это изменяет вышеупомянутый синтаксис, при использовании неявных значений теперь аргументы, когда они указаны, должны иметь форму:

./dc-ctl -b500

вместо

./dc-ctl -b 500

Надеюсь, это будет полезно для кого-то еще.

4
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: