当前位置: 首页 > news >正文

6.4 Case Studies - A Simple Logging Archive Class

下面这段内容介绍了一个示例,目的是帮助澄清"归档概念(Archive Concept)"的用法,以便用户可以实现自己的归档类。simple_log_archive.hpp 实现了一个简单但实用的归档类,用于将任何可序列化类型以可读的格式发送到输出文本流中。使用这个归档类非常简单,示例如下:

#include "simple_log_archive.hpp"
...
// 显示完整的时间表
simple_log_archive log(std::cout);
log << schedule;

上述代码将时间表 schedule 以可读的格式输出到标准输出流,并且产生了以下输出:

schedule count 6item first driver bobhour 6minute 24second -> stops count 3item -> latitude degrees 34minutes 135seconds 52.56longitude degrees 134minutes 22seconds 78.3
...

这个示例的完整代码可以在 demo_simple_log.cpp 中找到。要更好地理解它的工作原理,可以查看 “Trivial Archive”。此外,请注意以下内容:

  • 仅包含了160行代码。
  • 仅包含头文件 - 无需链接到序列化库。
  • 能够显示所有可序列化类型。
  • 缺少一些功能。例如,它不会显示作为二进制数据序列化的信息。
  • 当给定指向多态基类的指针时,它不会显示派生类型的数据,仅显示基类的信息。
  • 如果需要添加这种功能,可以查看下一个示例。

simple_log_archive.hpp

#ifndef BOOST_SIMPLE_LOG_ARCHIVE_HPP
#define BOOST_SIMPLE_LOG_ARCHIVE_HPP// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif/1/2/3/4/5/6/7/8
// simple_log_archive.hpp// (C) Copyright 2010 Robert Ramey - http://www.rrsd.com . 
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)//  See http://www.boost.org for updates, documentation, and revision history.#include <ostream>
#include <cstddef> // std::size_t#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{ using ::size_t; 
} // namespace std
#endif#include <boost/type_traits/is_enum.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/equal_to.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>/
// log data to an output stream.  This illustrates a simpler implemenation
// of text output which is useful for getting a formatted display of
// any serializable class.  Intended to be useful as a debugging aid.
class simple_log_archive {std::ostream & m_os;unsigned int m_depth;template<class Archive>struct save_enum_type {template<class T>static void invoke(Archive &ar, const T &t){ar.m_os << static_cast<int>(t);}};template<class Archive>struct save_primitive {template<class T>static void invoke(Archive & ar, const T & t){ar.m_os << t;}};template<class Archive>struct save_only {template<class T>static void invoke(Archive & ar, const T & t){// make sure call is routed through the highest interface that might// be specialized by the user.boost::serialization::serialize_adl(ar, const_cast<T &>(t), ::boost::serialization::version< T >::value);}};template<class T>void save(const T &t){typedef BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<boost::is_enum< T >,boost::mpl::identity<save_enum_type<simple_log_archive> >,//elseBOOST_DEDUCED_TYPENAME boost::mpl::eval_if<// if its primitiveboost::mpl::equal_to<boost::serialization::implementation_level< T >,boost::mpl::int_<boost::serialization::primitive_type>>,boost::mpl::identity<save_primitive<simple_log_archive> >,// elseboost::mpl::identity<save_only<simple_log_archive> >> >::type typex;typex::invoke(*this, t);}    #ifndef BOOST_NO_STD_WSTRINGvoid save(const std::wstring &ws){m_os << "wide string types not suported in log archive";}#endifpublic:///// Implement requirements for archive concepttypedef boost::mpl::bool_<false> is_loading;typedef boost::mpl::bool_<true> is_saving;// this can be a no-op since we ignore pointer polymorphismtemplate<class T>void register_type(const T * = NULL){}unsigned int get_library_version(){return 0;}void save_binary(const void *address, std::size_t count){m_os << "save_binary not implemented";}// the << operators template<class T>simple_log_archive & operator<<(T const & t){m_os << ' ';save(t);return * this;}template<class T>simple_log_archive & operator<<(T * const t){m_os << " ->";if(NULL == t)m_os << " null";else*this << * t;return * this;}template<class T, int N>simple_log_archive & operator<<(const T (&t)[N]){return *this << boost::serialization::make_array(static_cast<const T *>(&t[0]),N);}template<class T>simple_log_archive & operator<<(const boost::serialization::nvp< T > & t){m_os << '\n'; // start line with each named object// indent according to object depthfor(unsigned int i = 0; i < m_depth; ++i)m_os << ' ';++m_depth;m_os << t.name(); // output the name of the object* this << t.const_value();--m_depth;return * this;}// the & operator template<class T>simple_log_archive & operator&(const T & t){return * this << t;}///simple_log_archive(std::ostream & os) :m_os(os),m_depth(0){}
};#endif // BOOST_SIMPLE_LOG_ARCHIVE_HPP

demo_log.cpp

/1/2/3/4/5/6/7/8
//
// demo_log.cpp
//
// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com .
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)#include <iostream>
#include <cstdio>#include "demo_gps.hpp"
#include "simple_log_archive.hpp"int main(int argc, char *argv[])
{   // make the schedulebus_schedule schedule;// fill in the data// make a few stopsbus_stop *bs0 = new bus_stop_corner(gps_position(34, 135, 52.560f),gps_position(134, 22, 78.30f),"24th Street", "10th Avenue");bus_stop *bs1 = new bus_stop_corner(gps_position(35, 137, 23.456f),gps_position(133, 35, 54.12f),"State street", "Cathedral Vista Lane");bus_stop *bs2 = new bus_stop_destination(gps_position(35, 136, 15.456f),gps_position(133, 32, 15.300f),"White House");bus_stop *bs3 = new bus_stop_destination(gps_position(35, 134, 48.789f),gps_position(133, 32, 16.230f),"Lincoln Memorial");// make a  routesbus_route route0;route0.append(bs0);route0.append(bs1);route0.append(bs2);// add trips to scheduleschedule.append("bob", 6, 24, &route0);schedule.append("bob", 9, 57, &route0);schedule.append("alice", 11, 02, &route0);// make aother routesbus_route route1;route1.append(bs3);route1.append(bs2);route1.append(bs1);// add trips to scheduleschedule.append("ted", 7, 17, &route1);schedule.append("ted", 9, 38, &route1);schedule.append("alice", 11, 47, &route1);// display the complete schedulesimple_log_archive log(std::cout);log << schedule;delete bs0;delete bs1;delete bs2;delete bs3;return 0;
}
http://www.lryc.cn/news/173781.html

相关文章:

  • 【深度学习实验】前馈神经网络(九):整合训练、评估、预测过程(Runner)
  • 002-第一代硬件系统架构确立及产品选型
  • Go基础语法:指针和make和new
  • 039_小驰私房菜_Camera perfermance debug
  • Caché for Windows安装及配置
  • 代码随想录算法训练营20期|第四十六天|动态规划part08|● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!
  • 系统安装(一)CentOS 7 本地安装
  • obsidian使用指南
  • 【ardunio】青少年机器人四级实操代码(2023年9月)
  • MYSQL的存储过程
  • [kubernetes/docker] failed to resolve reference ...:latest: not found
  • 彻底解决win11系统0x80070032
  • 解决因为修改SELINUX配置文件出错导致Faild to load SELinux poilcy无法进入CentOS7系统的问题
  • flask中的跨域处理-方法二不使用第三方库
  • 矿山定位系统-矿井人员定位系统在矿山自动化安全监控过程中的应用
  • JS-ECharts-前端图表 多层级联合饼图、柱状堆叠图、柱/线组合图、趋势图、自定义中线、平均线、气泡备注点
  • 【eslint】屏蔽语言提醒
  • 【python】入门第一课:了解基本语法(数据类型)
  • csa从初阶到大牛(练习题2-查询)
  • 【视觉SLAM入门】8. 回环检测,词袋模型,字典,感知,召回,机器学习
  • SpringBean的生命周期
  • uni-app 之 picker选择器
  • 整合车辆出险报告Api接口,轻松管理车险理赔!
  • eNSP基础网络学习-v02
  • mac环境安装多个node版本(可切换)
  • Linux 操作技巧
  • 一个电子信息工程学生的历程和内心感想
  • 【zookeeper】zk集群安装与启动踩坑点
  • 【计算机网络】 拥塞控制
  • 【react】慎用useLayoutEffect转而使用useEffect