2010-03-05 4 views
4

Boost.Program_options обеспечивает возможность передать несколько маркеров через аргументы командной строки следующим образом:Boost.Program_options фиксированное количество жетонов

std::vector<int> nums;  

po::options_description desc("Allowed options"); 
desc.add_options() 
    ("help", "Produce help message.") 
    ("nums", po::value< std::vector<int> >(&nums)->multitoken(), "Numbers.") 
; 

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

Однако то, что является предпочтительным способом принимать только фиксированное количество аргументов? Единственное решение, которое я мог придумать, - это присвоить вручную значения:

int nums[2];  

po::options_description desc("Allowed options"); 
desc.add_options() 
    ("help", "Produce help message.") 
    ("nums", "Numbers.") 
; 

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

if (vm.count("nums")) { 
    // Assign nums 
} 

Это немного странно. Есть ли лучшее решение?

ответ

2

Библиотека ускорения предоставляет только предопределенные механизмы. Быстрый поиск не нашел чего-то с фиксированным числом значений. Но вы можете создать это сами. po::value< std::vector<int> >(&nums)->multitoken() - это только специализированный класс value_semantic. Как вы можете видеть, этот класс предлагает методы min_tokens и max_tokens, которые, похоже, делают именно то, что вы хотите. Если вы посмотрите на definition класса typed_value (это объект, который создается, когда вы звоните po::value< std::vector<int> >(&nums)->multitoken()), вы можете понять, как методы должны быть переопределены.

+0

Я видел 'min_tokens' и' max_tokens', но я не знал, как они предназначены для использования. Спасибо, что указали класс 'typed_value'. Похоже, это путь, хотя это не так просто, как я надеялся. – kloffy

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