Эхо вводит параметры командной строки в Boost
Я использую boost::program_options для анализа параметров командной строки. Я хотел бы, чтобы моя программа отправляла введенные параметры пользователю обратно для проверки. Это звучит как простая задача, но я не смог найти элегантного решения.
Проблема заключается в том, что пользователь может вводить все виды типов данных (строки, целые числа, логические значения и т. Д.). Обычно это хорошо обрабатывается бустом. Но у меня проблемы с приведением значений обратно к строкам, чтобы передать их пользователю.
Вот что я сейчас делаю
// set up program options
po::options_description optdesc("Allowed options");
optdesc.add_options()
("help", "Produces this help screen")
("opt1", po::value<string>(), "Option 1")
("opt2", po::value<int>(), "Option 2")
("opt3", po::value<bool>(), "Option 3);
// parse command line
try
{
po::store(po::parse_command_line(argc, argv, optdesc), cmdline);
po::notify(cmdline);
}
// do error handling ...
// echo parameters back to user
for (po::variables_map::iterator it = cmdline.begin(); it != cmdline.end(); ++it)
{
boost::any arg = it->second.value();
if (typeid(string) == arg.type())
{
cout << " " << it->first << ": " << boost::any_cast<string>(it->second.value()) << endl;
}
else if (typeid(int) == arg.type())
{
cout << " " << it->first << ": " << boost::any_cast<int>(it->second.value()) << endl;
}
// etc...
Мне действительно не нравится это решение. Поскольку Boost может преобразовывать пользовательский ввод из строки в подходящее значение, он также должен иметь возможность преобразовывать значение обратно в строковое представление без явного тестирования на тип данных.
Это возможно? Если да, как я могу это сделать.
Спасибо
2 ответа
Я столкнулся с подобной проблемой, и это мое решение. Короче говоря, вы должны написать свой собственный контейнер для опций, основанных на boost:: option, а не на boots::any (на которых основан boost:: po). Этот контейнер может быть заполнен с помощью уведомлений опций boost:: po. Это позволит вам использовать шаблон Visitor для ваших опций и обрабатывать их в общем виде.
У тебя уже есть argv
а также argc
просто верните их пользователю
#include <iostream>
#include <iterator>
int
main(int argc, char* argv[])
{
std::cout << "got " << argc << " args" << std::endl;
std::copy(argv + 1, argv + argc, std::ostream_iterator<char*>(std::cout, " "));
std::cout << std::endl;
}
производит
samm:stackru samm$ ./a.out asdf 1 2 3 hello world
got 7 args
asdf 1 2 3 hello world
samm:stackru samm$
Там нет необходимости перебирать variables_map
и разыграть каждую запись.