五分钟快速入门

本教程使用XML。注意,这个库不是专门绑定到XML的,而是可以使用任何其他支持的格式(如INI或JSON)。之所以选择XML,是因为作者认为很多人都熟悉XML。

假设我们正在为某个应用程序编写一个日志系统,并且需要在程序启动时从文件中读取日志配置。带有日志配置的文件如下所示:

  1. <debug>
  2. <filename>debug.log</filename>
  3. <modules>
  4. <module>Finance</module>
  5. <module>Admin</module>
  6. <module>HR</module>
  7. </modules>
  8. <level>2</level>
  9. </debug>

它包含日志文件名、启用日志记录的模块列表和调试级别值。

我们需要包含的头文件:

  1. #include <boost/property_tree/ptree.hpp>
  2. #include <boost/property_tree/xml_parser.hpp>
  3. #include <boost/foreach.hpp>
  4. #include <string>
  5. #include <set>
  6. #include <exception>
  7. #include <iostream>
  8. namespace pt = boost::property_tree;

为了存储日志的配置信息,我们创建一个结构来存储它

  1. struct debug_settings
  2. {
  3. std::string m_file; // log filename
  4. int m_level; // debug level
  5. std::set<std::string> m_modules; // modules where logging is enabled
  6. void load(const std::string &filename);
  7. void save(const std::string &filename);
  8. };

现在需要做的就是编写load()和save()成员函数的实现。让我们先来处理load()。它只包含7行代码,尽管它做了所有必要的事情,包括错误报告:

  1. void debug_settings::load(const std::string &filename)
  2. {
  3. // Create empty property tree object
  4. pt::ptree tree;
  5. // Parse the XML into the property tree.
  6. pt::read_xml(filename, tree);
  7. // Use the throwing version of get to find the debug filename.
  8. // If the path cannot be resolved, an exception is thrown.
  9. m_file = tree.get<std::string>("debug.filename");
  10. // Use the default-value version of get to find the debug level.
  11. // Note that the default value is used to deduce the target type.
  12. m_level = tree.get("debug.level", 0);
  13. // Use get_child to find the node containing the modules, and iterate over
  14. // its children. If the path cannot be resolved, get_child throws.
  15. // A C++11 for-range loop would also work.
  16. BOOST_FOREACH(pt::ptree::value_type &v, tree.get_child("debug.modules")) {
  17. // The data function is used to access the data stored in a node.
  18. m_modules.insert(v.second.data());
  19. }
  20. }

存储函数

  1. void debug_settings::save(const std::string &filename)
  2. {
  3. // Create an empty property tree object.
  4. pt::ptree tree;
  5. // Put the simple values into the tree. The integer is automatically
  6. // converted to a string. Note that the "debug" node is automatically
  7. // created if it doesn‘t exist.
  8. tree.put("debug.filename", m_file);
  9. tree.put("debug.level", m_level);
  10. // Add all the modules. Unlike put, which overwrites existing nodes, add
  11. // adds a new node at the lowest level, so the "modules" node will have
  12. // multiple "module" children.
  13. BOOST_FOREACH(const std::string &name, m_modules)
  14. tree.add("debug.modules.module", name);
  15. // Write property tree to XML file
  16. pt::write_xml(filename, tree);
  17. }

来个全代码的:

  1. //
  2. // Created by 瓜不甜 on 2018/1/20.
  3. //
  4. #include <boost/property_tree/ptree.hpp>
  5. #include <boost/property_tree/xml_parser.hpp>
  6. #include <boost/foreach.hpp>
  7. #include <string>
  8. #include <set>
  9. #include <exception>
  10. #include <iostream>
  11. namespace pt = boost::property_tree;
  12. struct debug_settings
  13. {
  14. std::string m_file; // log filename
  15. int m_level; // debug level
  16. std::set<std::string> m_modules; // modules where logging is enabled
  17. void load(const std::string &filename);
  18. void save(const std::string &filename);
  19. };
  20. void debug_settings::load(const std::string &filename)
  21. {
  22. // Create empty property tree object
  23. pt::ptree tree;
  24. // Parse the XML into the property tree.
  25. pt::read_xml(filename, tree);
  26. // Use the throwing version of get to find the debug filename.
  27. // If the path cannot be resolved, an exception is thrown.
  28. m_file = tree.get<std::string>("debug.filename");
  29. // Use the default-value version of get to find the debug level.
  30. // Note that the default value is used to deduce the target type.
  31. m_level = tree.get("debug.level", 0);
  32. // Use get_child to find the node containing the modules, and iterate over
  33. // its children. If the path cannot be resolved, get_child throws.
  34. // A C++11 for-range loop would also work.
  35. BOOST_FOREACH(pt::ptree::value_type &v, tree.get_child("debug.modules")) {
  36. // The data function is used to access the data stored in a node.
  37. m_modules.insert(v.second.data());
  38. }
  39. }
  40. void debug_settings::save(const std::string &filename)
  41. {
  42. // Create an empty property tree object.
  43. pt::ptree tree;
  44. // Put the simple values into the tree. The integer is automatically
  45. // converted to a string. Note that the "debug" node is automatically
  46. // created if it doesn‘t exist.
  47. tree.put("debug.filename", m_file);
  48. tree.put("debug.level", m_level);
  49. // Add all the modules. Unlike put, which overwrites existing nodes, add
  50. // adds a new node at the lowest level, so the "modules" node will have
  51. // multiple "module" children.
  52. BOOST_FOREACH(const std::string &name, m_modules)
  53. tree.add("debug.modules.module", name);
  54. // Write property tree to XML file
  55. pt::write_xml(filename, tree);
  56. }
  57. void test1(){
  58. debug_settings a;
  59. a.load("setting.xml");
  60. std::cout<<a.m_file<<std::endl;
  61. std::cout<<a.m_level<<std::endl;
  62. std::set<std::string>::iterator i;
  63. for ( i = a.m_modules.begin(); i != a.m_modules.end(); ++i) {
  64. std::cout<<*i<<std::endl;
  65. }
  66. }

很明显,这个是个非常好用的结构!

简单,高效!

这里有个foreach结构:

BOOST_FOREACH(const std::string &name, m_modules)

{

tree.add("debug.modules.module", name);

}

这个是C++的一个类宏的高级应用了

null

原文地址:https://www.cnblogs.com/xujintao/p/8325932.html

时间: 2024-11-12 14:57:49

五分钟快速入门的相关文章

十分钟快速入门 Python,看完即会,不用收藏!

本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. 读完本篇文章后,可对 Python 语言特性.编码风格有一定了解,并可写出简单的 Python 程序. 100?多位经验丰富的开发者参与,在 Github 上获得了近?1000?个?star?的开源项目想了解下吗?项目地址:github.com/cachecats/c- 一.安装与运行 各个系统的 Pyth

vue.js--60分钟快速入门

Vue.js--60分钟快速入门 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 本文摘自:http://www.cnblogs.com/keepfool/p/5619070.html 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM

Vue.js 60 分钟快速入门

Vue.js 60 分钟快速入门 转载 作者:keepfool 链接:http://www.cnblogs.com/keepfool/p/5619070.html Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为V

5分钟快速入门angular2。0

让我们从零开始,在JavaScript中建立一个超级简单的角angular2.0的应用. 请看demo <!DOCTYPE html> <html> <head> <title>Angular 2 QuickStart JS</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link

5分钟快速入门 - Less

下面给大家讲解下Less,纯手工,入门级别,相信没学过的人阅读完后就懂了,以下是我要讲的四点: 简单介绍 Less CSS 是一个使用广泛的 CSS 预处理器. 对 CSS 进行扩展,减少很多 CSS 的代码量. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承, 运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Firefox),也可一在服务端运行 (借助 Node.js). 快速入门 在服务器端最容易的安装方式就是通过 npm (node.j

Python 30分钟快速入门指南

学习地址 中文版:Python 30分钟入门指南 英文版:Learn X in Y minutes 学习时间 2019/03/10 19:00 - 19:32,多用了2分钟. 原文地址:https://www.cnblogs.com/huerxiong/p/10506664.html

Vue.js——60分钟快速入门

Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 本文摘自:http://www.cnblogs.com/keepfool/p/5619070.html 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将

Vue.js&mdash;&mdash;60分钟快速入门

Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将DOM和数据绑定起来.一旦你创建了绑定,DOM将和数据保持同步,每当变更了数据,DOM

Vue.js&mdash;&mdash;vue-router 60分钟快速入门

概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用,是用一些超链接来实现页面切换和跳转的.在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换. 本文将以示例的形式来介绍vue-router的各个特性,一共包含6个示例,每个示例都有乞丐版,前5个示例有皇帝版.乞丐版是将所有代码混杂在一起的HTML页面,皇帝版是基于vue