c++ - 有没有办法打印 boost 程序选项的配置文件

标签 c++ boost boost-program-options

我正在使用 boost::program_options 从配置文件中获取参数。

我知道我可以手动创建一个文件,程序选项会解析它。但我正在寻找一种让程序自动生成文件的方法。意思是打印出选项的名称和它的值。例如:

>./main 

没有选项会生成如下所示的 init.cfg

[wave packet]
width = 1
position = 2.0
[calculation parameters]
levels = 15

然后我会进入该文件使用文本编辑器更改值并使用此文件:

>./main init.cfg

解决这个问题的一个好方法是让 variables_map 拥有 operator<< .这样我就可以将它写入文件。更改值。读取文件。都是一样的格式,不用写每一行。

我在文档或示例中找不到类似的内容。请让我知道这是否可能

编辑:Sam Miller 展示了如何分段解析 ini 文件。但是,我仍然无法从 boost::program_options::variables_map vm 获取值。 我尝试了以下

  for(po::variables_map::iterator it = vm.begin(); it != vm.end(); ++it)
  {
    if(it->first!="help"&&it->first!="config")
    cout << "first - " << it->first << ", second - " << it->second.value() << "\n";
  }

而不是 it->second.value() ,出错了。我也试过it->second .我也遇到了错误:

icpc -lboost_serialization -lboost_program_options -c programOptions.cc
programOptions.cc(60): error: no operator "<<" matches these operands
            operand types are: std::basic_ostream<char, std::char_traits<char>> << boost::any
      cout << "first - " << it->first << ", second - " << it->second.value() << "\n";
                                                       ^

compilation aborted for programOptions.cc (code 2)
make: *** [programOptions.o] Error 2

如果我使用 it->second.as<int>(),我会正确获取值但并非我所有的值都是整数,一旦我达到双倍,程序就会崩溃:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >'
  what():  boost::bad_any_cast: failed conversion using boost::any_cast

最佳答案

据我所知,没有一种使用 program_options 的方法。您可以使用属性树库来write the ini file .

这是一个简短的例子:

macmini:stackoverflow samm$ cat property.cc 
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>

#include <iostream>

int
main()
{
    using boost::property_tree::ptree;

    ptree root;

    ptree wave_packet;
    wave_packet.put( "width", "1" );
    wave_packet.put( "position", "2.0" );

    ptree calculation_parameters;
    calculation_parameters.put( "levels", "15" );

    root.push_front(
            ptree::value_type( "calculation parameters", calculation_parameters )
            );
    root.push_front(
            ptree::value_type( "wave packet", wave_packet )
            );

    write_ini( std::cout, root );

    return 0;
}

macmini:stackoverflow samm$ g++ property.cc 
macmini:stackoverflow samm$ ./a.out
[wave packet]
width=1
position=2.0
[calculation parameters]
levels=15
macmini:stackoverflow samm$ 

关于c++ - 有没有办法打印 boost 程序选项的配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4703134/

相关文章:

c++ - 如何深拷贝QMap和其他Qt容器

c++ - 如何为多种线程加锁 pthread_mutex_lock

c++ - boost 时出现段错误( boost :filesystem:exists)

c++ - 什么 SAFESEH :NO option actually do

c++ - 如何在 --help 输出中显示命令行操作符描述

boost::program_options 重载验证不明确

c++ - 将int变量放入数组

c++ - 是否可以在正则表达式中命名子模式,然后通过 C++ 中的子模式名称提取匹配项?

c++ - boost::mpl::fold 用于双参数抽象

c++ - 调用 boost parseOptions 时保持预设(非默认)值