2016-07-07 3 views
1

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

Пример: [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. «многословие» принимает строковый аргумент, который мы по умолчанию для «»
  3. мы проверяем, что строка содержит только «v-х
  4. если variables_map содержит„многословие“аргумент, то -v или --verbosity должны были упомянуты в командной строке. Поэтому добавьте 'v' в строку.
  5. verbosity - длина строки.

пример:

$ ./a.out -vvvv 
verbosity: 4 
$ 
+0

Спасибо! Я вижу, что вы имеете в виду, что это не очень чисто, но я делаю то, что хочу. Теперь моя забота заключается в том, что он не подходит с другим вариантом (например, '-vvdb' дал бы мне« Недопустимую многословность », даже если бы у меня были другие флаги с синонимами' d' и 'b'. Однако я предполагаю, что это неизбежно, и я могу просто указать в документах, что подробность должна быть указана отдельно. – wKavey

+0

Также - теперь я столкнулся с проблемой, когда я не могу передать позиционный аргумент (входной файл), если опция '-v' это один из них. Он работает, если существует более одного v (ex: '-vv input_file' или если я включаю другой аргумент после одного v' -v -d input_file', но не иначе ('-v input_file') Any ключ к разгадке? – wKavey

Смежные вопросы