Эхо вводит параметры командной строки в 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 и разыграть каждую запись.

Другие вопросы по тегам