Параметры программы 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;
}
Как это устроено:
- определить опцию "--verbosity" с синонимом "-v".
- 'verbosity' принимает строковый аргумент, который по умолчанию равен ""
- мы проверяем, что строка содержит только 'V
- если
variables_map
содержит аргумент 'verbosity', тогда в командной строке должны быть указаны -v или --verbosity. Поэтому добавьте 'v' к строке. - многословие - длина строки.
пример:
$ ./a.out -vvvv
verbosity: 4
$