2014-10-14 3 views
2

Мне нужно разобрать аргумент с префиксом с boost :: program_options как -O1/-O2/-O3, поэтому -O является префиксом, за которым следует уровень оптимизации как номер.Аргумент префиксных аргументов с boost :: program_options?

Он заявил, используя поддержку LLVM CommandLine подобное, и мне нужно как то:

cl::opt<char> 
    OptLevel("O", 
     cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 
        "(default = '-O2')"), 
     cl::Prefix, 
     cl::ZeroOrMore, 
     cl::init(' ')); 
+0

Я не уверен, почему вопрос downvoted - это пример реальной жизни – 4ntoine

ответ

2

Это моя идея: обратите внимание на использование po::command_line_style::short_allow_adjacent:

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

namespace po = boost::program_options; 

int main(int argc, char** argv) 
{ 
    int opt; 
    po::options_description desc("Allowed options"); 
    desc.add_options() 
     ("help", "produce help message") 
     ("optimization,O", po::value<int>(&opt)->default_value(1), "optimization level") 
     ("include-path,I", po::value< std::vector<std::string> >(), "include path") 
     ("input-file", po::value< std::vector<std::string> >(), "input file") 
     ; 

    po::variables_map vm; 
    po::store(
      po::parse_command_line(argc, argv, desc, 
       po::command_line_style::allow_dash_for_short | 
       po::command_line_style::allow_long | 
       po::command_line_style::long_allow_adjacent | 
       po::command_line_style::short_allow_adjacent | 
       po::command_line_style::allow_short 
      ), 
      vm); 

    po::notify(vm); 

    if (vm.count("help")) { 
     std::cout << desc << "\n"; 
     return 1; 
    } 

    std::cout << "Optimization level chosen: " << opt << "\n"; 
} 

Live On Coliru

Так, что

./a.out -O23 
./a.out -O 4 
./a.out -I /usr/include -I /usr/local/include 
./a.out --optimization=3 

Печать

Optimization level chosen: 23 
Optimization level chosen: 4 
Optimization level chosen: 1 
Optimization level chosen: 3 
+0

я был в состоянии получить его только с помощью «О1», как ** долгое ** имя (' («O1», po :: значение (& OptLevelO1) -> zero_tokens() -> default_value (false), «Уровень оптимизации 1. Подобно clang -O1») ') и' .style (po :: command_line_style :: default_style | po :: command_line_style :: allow_long_disguise) // разрешить передачу длинных аргументов с использованием одной тире ('-') ' – 4ntoine

+0

@ 4ntoine На самом деле это был бы мой подход, но вы specfically попросили изменить целочисленный аргумент (и я был ожидая «Мы не можем добавить сотни опций для облегчения' -O438' :)) – sehe

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