Я получил частичное решение от Как принять пустое значение в 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
Надеюсь, это поможет кому-то еще.