Параметры с и без аргументов в boost :: program_options - PullRequest
7 голосов
/ 08 февраля 2010

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

dc-ctl --brightness 15

и "get mode" будет:

dc-ctl --brightness
brightness=15

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

error: required parameter is missing in 'brightness'

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

1 Ответ

4 голосов
/ 08 февраля 2010

Я получил частичное решение от Как принять пустое значение в 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

Надеюсь, это поможет кому-то еще.

...