c++ - variables_map - undefined reference to boost program options




При использовании boost:: program_options, как установить имя аргумента? (4)

При использовании boost::program_options , как установить имя аргумента для boost::program_options::value<>() ?

#include <iostream>
#include <boost/program_options.hpp>

int main()
{
  boost::program_options::options_description desc;

  desc.add_options()
    ("width", boost::program_options::value<int>(),
     "Give width");

  std::cout << desc << std::endl;

  return 0;
}

Приведенный выше код дает:

  --width arg           Give width

Я хочу заменить имя arg чем-то более описательным, например NUM :

  --width NUM           Give width

В последних версиях Boost (проверено только на> = 1,61) это полностью поддерживается. Ниже небольшой модификации первого примера в учебнике, где вместо «arg» печатается «УРОВЕНЬ»:

po::options_description desc("Allowed options");
desc.add_options()
    ("help", "produce help message")
    ("compression", po::value<int>()->value_name("LEVEL"), "set compression level")
;

Живой пример


В текущей версии boost (1.53) вам больше не нужно создавать свой собственный класс, как предложил Тим Сильвестр. Можно использовать: boost :: program_options :: typed_value. На каком значении value_name можно настроить.

#include <iostream>
#include <boost/program_options.hpp>
using boost::program_options::typed_value;
using boost::program_options::options_description;

int main(int argc, char **argv) {
    options_description desc("Usage");

    int someValue;
    auto someOption = new typed_value<decltype(someValue)>(&someValue);
    someOption->value_name("NUM");
    desc.add_options()
        ("some-option,s", someOption, "The option\n");

    std::cout << desc << std::endl;
    return 0;
}

Отображает настроенное имя аргумента:

Usage:
-s [ --some-option ] NUM The option

Можно заменить arg чем-то другим через глобальную переменную boost::program_options::arg :

boost::program_options::arg = "NUM";

Но поскольку это глобальная переменная, это не помогает решить проблему, когда для нескольких параметров могут потребоваться разные аргументы.


Подход, данный Codebender, является единственным, который вы можете использовать. Это на самом деле намеренно - использование «NUM» для имени аргумента представляется микро-оптимизацией, которая не стоит делать. Хорошее описание опции должно также сказать, какой аргумент ожидается.





boost-program-options