随笔分类 -  c++11 使用c++11改进我们的程序系列

使用c++11改进我们的程序系列
从一个例子看现代C++的威力
摘要:引子 最近准备重构一下我的kapok库,让meta函数可以返回元素为kv的tuple,例如: 类似这个META的实现我在msgpack的库里看到了,在这里: msgpack中仅仅是宏元的代码就数百行了,看起来非常复杂,msgpack之所以用这么复杂的方式去实现恐怕是为了支持c++98/03标准。本来 阅读全文

posted @ 2016-03-14 20:24 qicosmos(江南) 阅读(11397) 评论(3) 推荐(1) 编辑

C++11实现一个自动注册的工厂
摘要:实现动机 工厂方法是最简单地创建派生类对象的方法,也是很常用的,工厂方法内部使用switch-case根据不同的key去创建不同的派生类对象,下面是一个伪代码。Message* create(int type){ switch (type) { case MSG_PGSTATS:... 阅读全文

posted @ 2015-12-30 21:51 qicosmos(江南) 阅读(15373) 评论(10) 推荐(6) 编辑

CHECK MEMBER TYPE
摘要:检查类里是否存在某种类型的几种方法,以检查xxx类型为例:方法1:templateclass has_member_type_Type{ struct big { char a[2]; }; template static big probe(typename C::xxx*); //... 阅读全文

posted @ 2015-11-02 10:14 qicosmos(江南) 阅读(1503) 评论(1) 推荐(0) 编辑

C++11实现一个轻量级的AOP框架
摘要:AOP介绍 AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充。面向对象编程中的继承是一种从上而下的关系,不适合定义从左到右的横向关系,如果继承体系中的很多无关联的对象都有一些公共行为,这些公共行为可能分散在不同... 阅读全文

posted @ 2015-08-31 10:13 qicosmos(江南) 阅读(11815) 评论(10) 推荐(5) 编辑

C++11模版元编程的应用
摘要:1.概述 关于C++11模板元的基本用法和常用技巧,我在程序员2015年2月B《C++11模版元编程》一文(后称前文)中已经做了详细地介绍,那么C++11模版元编程用来解决什么实际问题呢,在实际工程中又该如何应用呢?本文将侧重介绍C++11模板的一些具体应用,向读者展示模版元编程的具体应用。 我... 阅读全文

posted @ 2015-08-31 09:54 qicosmos(江南) 阅读(8852) 评论(0) 推荐(0) 编辑

c++11实现一个简单的lexical_cast
摘要:boost中有一个lexical_cast可以用统一的方式来做基本类型之间的转换,比如字符串到数字,数字到字符串,bool和字符串及数字之间的相互转换。boost::lexical_cast的用法比较简单:#include #include #include #define ERROR_LEX... 阅读全文

posted @ 2015-05-28 21:48 qicosmos(江南) 阅读(4851) 评论(0) 推荐(0) 编辑

应该用bind+function取代虚函数吗?
摘要:用bind+function取代虚函数在好几年前就有人提出了,曾引起广泛的讨论,有支持的有反对的,可能赞成的人占大多数。这个话题挺有趣,本来是作为技术沙龙的开放性话题来讨论的,由于时间关系并没有讨论。今天就来具体探讨一下这个问题,我将做两个实验来验证一下这两种做法,具体是实现两个模式:策略模式和责任... 阅读全文

posted @ 2015-05-25 14:36 qicosmos(江南) 阅读(5965) 评论(3) 推荐(4) 编辑

一个更好的C++序列化/反序列化库Kapok
摘要:KapokFAQ1.Kapok的特点简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack相当。它是纯c++11实现,因此需要支持C++11的编译器。2.主要功能对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个t... 阅读全文

posted @ 2015-05-08 11:57 qicosmos(江南) 阅读(11525) 评论(27) 推荐(2) 编辑

C++11模版元编程
摘要:1.概述 模版元编程(template metaprogram)是C++中最复杂也是威力最强大的编程范式,它是一种可以创建和操纵程序的程序。模版元编程完全不同于普通的运行期程序,它很独特,因为模版元程序的执行完全是在编译期,并且模版元程序操纵的数据不能是运行时变量,只能是编译期常量,不可修改,另外它 阅读全文

posted @ 2015-05-05 22:07 qicosmos(江南) 阅读(54127) 评论(4) 推荐(15) 编辑

泛化之美--C++11可变模版参数的妙用
摘要:1概述<!--?xml:namespace prefix = "o" ns = "urn:schemas-microsoft-com:office:office" /--> C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高 阅读全文

posted @ 2015-03-10 14:30 qicosmos(江南) 阅读(136875) 评论(24) 推荐(38) 编辑

从4行代码看右值引用
摘要:从4行代码看右值引用 概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的: int i = 0; int& j = i; 这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右 阅读全文

posted @ 2015-02-10 11:50 qicosmos(江南) 阅读(56621) 评论(19) 推荐(42) 编辑

c++11新增的一些便利的算法
摘要:c++11新增加了一些便利的算法,这些新增的算法使我们的代码写起来更简洁方便,这里仅仅列举一些常用的新增算法,算是做个总结,更多的新增算法读者可以参考http://en.cppreference.com/w/cpp/algorithm。 算法库新增了三个用于判断的算法all_of、any_of... 阅读全文

posted @ 2014-09-07 12:45 qicosmos(江南) 阅读(9188) 评论(3) 推荐(3) 编辑

(原创)实现一个简单的字符串格式化方法
摘要:c#中格式化字符串很简单,比如我们可以这样格式化一个字符串:string str = string.format("test {0}, {1}, {2}, {1}, {0} sample", 1, 2.3, "ok");Console.WriteLine(str);将输出:test 1, 2.3, ... 阅读全文

posted @ 2014-07-05 12:02 qicosmos(江南) 阅读(3850) 评论(16) 推荐(2) 编辑

(原创)舌尖上的c++--相逢
摘要:引子 前些时候,我在群里出了一道题目:将变参的类型连接在一起作为字符串并返回出来,要求只用函数实现,不能借助于结构体实现。用结构体来实现比较简单:template struct Connect;templatestruct Connect{ static string GetName() ... 阅读全文

posted @ 2014-05-26 14:32 qicosmos(江南) 阅读(2868) 评论(7) 推荐(4) 编辑

(原创)一个超级对象池的实现
摘要:对象池对于创建开销比较大的对象来说很有意义,为了避免重复创建开销比较大的对象,我们可以通过对象池来优化。对象池的思路比较简单,事先创建好一批对象,放到一个集合中,以后每当程序需要新的对象时候,都从对象池里获取,每当程序用完该对象后,都把该对象归还给对象池。这样会避免重复的对象创建,提高程序性能。... 阅读全文

posted @ 2014-04-18 17:24 qicosmos(江南) 阅读(9518) 评论(7) 推荐(3) 编辑

(原创)c++11中的日期和时间库
摘要:c++11提供了日期时间相关的库chrono,通过chrono相关的库我们可以很方便的处理日期和时间。c++11还提供了字符串的宽窄转换功能,也提供了字符串和数字的相互转换的库。有了这些库提供的便利的工具类,我们能方便的处理日期和时间相关的转换和格式输出。chrono chrono库主要包含了... 阅读全文

posted @ 2014-04-03 12:14 qicosmos(江南) 阅读(35635) 评论(8) 推荐(12) 编辑

(原创)结构体自动化转为char数组的实现
摘要:结构体自动化转换为char数组这个需求,来自于一个最近开发的一个项目,在项目开发过程中遇到一个小问题,需要将各种结构体拷贝到char数组中,这对于一个简单的结构体来说是很简单的事情,比如下面这个只有整形字段的结构体:struct A{ int a; int b;};char buf[100];A a = {1,2};memcpy(buf, &a, sizeof(A)); 一句memcpy就能将结构体a拷贝到char数组中去了,直接通过memcpy拷贝结构体只对于内存连续的结构体有效。如果结构体内存不连续,结构体中含有double、string、指针甚至嵌套结构体时,直接拷贝是... 阅读全文

posted @ 2014-03-15 10:44 qicosmos(江南) 阅读(23451) 评论(11) 推荐(7) 编辑

c++11实现c++14的optional
摘要:c++14中将包含一个std::optional类,它的功能和用法和boost的optional类似。optional内部存储空间可能存储了T类型的值也可能没有存储T类型的值,只有当optional被T初始化之后,这个optional才是有效的,否则是无效的,它实现了未初始化的概念。optional的应用场景函数返回无效对象 有时根据某个条件去查找对象时,如果查找不到对象时就会返回一个无效值,这不表明函数执行失败,而是表明函数正确执行了,但是结果却不是有用的值,这时就可以返回一个未初始化的optional对象出去,在外面判断这个optional对象是否有效对象是否被初始化,如果没有被初始... 阅读全文

posted @ 2014-03-02 22:37 qicosmos(江南) 阅读(12688) 评论(2) 推荐(3) 编辑

(原创)用c++11打造类似于python的range
摘要:python中的range函数表示一个连续的有序序列,range使用起来很方便,因为在定义时就隐含了初始化过程,因为只需要给begin()和end()或者仅仅一个end(),就能表示一个连续的序列。还可以指定序列产生的步长,如range(0,10,8)产生的序列为[0, 8], 默认的步长为1,... 阅读全文

posted @ 2014-02-08 14:35 qicosmos(江南) 阅读(3849) 评论(1) 推荐(4) 编辑

(原创)发布一个c++11开发的轻量级的并行Task库TaskCpp
摘要:TaskCpp简介 TaskCpp是c++11开发的一个跨平台的并行task库,它的设计思路来源于微软的并行计算库ppl和intel的并行计算库tbb,关于ppl和tbb我在前面有介绍。既然已经有了这两个大公司开发的并行计算库,我为什么还要开发自己的并行计算库。有两个原因:ppl只能在window... 阅读全文

posted @ 2014-01-27 16:04 qicosmos(江南) 阅读(11604) 评论(10) 推荐(12) 编辑

导航