Echo在Boost中输入了命令行参数

时间:2013-07-22 09:52:50

标签: c++ boost casting boost-program-options

我使用boost::program_options来解析命令行参数。我希望我的程序将输入的参数回显给用户进行验证。这听起来像一个简单的任务,但我无法找到一个优雅的解决方案。

问题是用户可以输入各种数据类型(字符串,整数,布尔值等)。通常这可以通过boost很好地处理。但是我很难将值转换回字符串,以便将它们反馈回用户。

这是我目前正在做的事情

// 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 个答案:

答案 0 :(得分:2)

您已经拥有argvargc,只需将其回传给用户

#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:stackoverflow samm$ ./a.out asdf 1 2 3 hello world
got 7 args
asdf 1 2 3 hello world 
samm:stackoverflow samm$

无需遍历variables_map并投射每个条目。

答案 1 :(得分:2)

我遇到了类似的问题,this是我的解决方案。 简而言之,你必须为boost :: variant创建自己的容器,而不是在boots :: any(boost :: po所基于的)上。可以通过boost :: po选项的通知程序填充此容器。这将允许您使用访问者模式作为选项并以通用方式处理它们。