Параметры программы Boost подсчитывают количество появлений флага

Я пытаюсь запрограммировать таким образом, чтобы пользователь моей программы указывал уровень детализации моей программы от 0 до 3. Кто-то сказал мне, что может быть способ настроить параметры программы так, чтобы я мог чтобы определить количество появлений флага, а затем запустить мою программу соответственно.

Пример:[none] -> level 0-v -> level 1-vv -> level 2-vvv -> level 3

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

1 ответ

Я не могу придумать хороший способ. boost::program_options Синтаксис опций немного более структурирован (и, возможно, более прост), чем getopt,

Вот один из способов:

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

int main(int argc, char**argv)
{
    namespace po = boost::program_options;

    std::string verbosity_values;

    po::options_description desc("Command Line Options");
    desc.add_options()("verbosity,v",
                       po::value(&verbosity_values)->implicit_value(""),
                       "verbose");

    po::variables_map vm;
    po::store(po::parse_command_line(argc, argv, desc), vm);
    po::notify(vm);

    if (vm.count("verbosity")) {
        verbosity_values += "v";
    }

    if (std::any_of(begin(verbosity_values), end(verbosity_values), [](auto&c) { return c != 'v'; })) {
        std::cerr << "invalid verbosity" << std::endl;
        std::exit(100);
    }

    std::cout << "verbosity: " << verbosity_values.size() << std::endl;

}

Как это устроено:

  1. определить опцию "--verbosity" с синонимом "-v".
  2. 'verbosity' принимает строковый аргумент, который по умолчанию равен ""
  3. мы проверяем, что строка содержит только 'V
  4. если variables_map содержит аргумент 'verbosity', тогда в командной строке должны быть указаны -v или --verbosity. Поэтому добавьте 'v' к строке.
  5. многословие - длина строки.

пример:

$ ./a.out -vvvv
verbosity: 4
$
Другие вопросы по тегам