上一页 1 ··· 3 4 5 6 7 8 9 10 下一页

2013年12月6日

(原创)如何使用boost.asio写一个简单的通信程序(一)

摘要: boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介绍如何写一个简单的通信程序来告诉读者如何使用asio,希望对asio的初学者有所帮助。由于只是介绍其基本用法,作为例子的简单示例并不考虑很多的业务逻辑和异常处理,只是介绍基本用法,让初学者入门。 使用asio容易出错的一个主要原因是因为它是基于proactor模式实现的,asio有很多异步操作接口,这些异步接口稍不注意就会出现莫名奇妙的错误,所以要用好asio的第一步是理解其异步操思想。异步... 阅读全文

posted @ 2013-12-06 11:45 qicosmos(江南) 阅读(11764) 评论(5) 推荐(9) 编辑

2013年11月13日

(原创)用c++11实现简洁的ScopeGuard

摘要: ScopeGuard的作用是确保资源面对异常时总能被成功释放,就算没有正常返回。惯用法让我们在构造函数里获取资源,当因为异常或者正常作用域结束,那么在析构函数里释放资源。总是能释放资源。如果没有异常抛出则正常结束,只是有异常发生或者没有正常退出时释放资源。关于ScopeGaurd的概念想多了解一... 阅读全文

posted @ 2013-11-13 14:20 qicosmos(江南) 阅读(5634) 评论(7) 推荐(0) 编辑

2013年11月12日

(原创)用c++11打造好用的any

摘要: 上一篇博文用c++11实现了variant,有童鞋说何不把any也实现一把,我正有此意,它的兄弟variant已经实现了,any也顺便打包实现了吧。其实boost.any已经挺好了,就是转换异常时,看不到详情,和boost.variant一样的问题。实现any比实现variant要简单,需要解决... 阅读全文

posted @ 2013-11-12 19:21 qicosmos(江南) 阅读(15304) 评论(1) 推荐(1) 编辑

2013年11月10日

(原创)用c++11打造好用的variant

摘要: variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它。它的具体类型是在初始化赋值时确定。boost中的variant的基本用法:typedef variant vt;vt v = 1;v = '2';v = 12.32; 用variant一个好处是可以擦除类型,不同类型的值都统一成一个variant,虽然这个variant只能存放已定义的类型,但这在很多时候已经够用了。 取值的时候,通过get(v)来获取真实值。然而,当T类型与v的类型不匹配时,会抛出一个bad_cast的异常来。boost的variant抛出的异常往往没有更多的信息,不知道到底是哪 阅读全文

posted @ 2013-11-10 10:47 qicosmos(江南) 阅读(10023) 评论(3) 推荐(1) 编辑

2013年10月25日

(原创)一个和c#中Lazy<T>类似的c++ Lazy<T>类的实现

摘要: 在.net 4.0中增加一个延迟加载类Lazy,它的作用是实现按需延迟加载,也许很多人用过。一个典型的应用场景是这样的:当初始化某个对象时,该对象引用了一个大对象,需要创建,这个对象的创建时需要较长的时间,同时也需要在托管堆上分配较多的空间,这样可能会在初始化时变得很慢,尤其是UI应用时,会导致用户体验很差。其实狠多时候并不需要马上就获取大数据,只是在需要时获取,这种场景就很适合延迟加载了。先看看c#中Lazy如何使用的吧:class LargeObject{ public int InitializedBy { get { return initBy; } } int ini... 阅读全文

posted @ 2013-10-25 22:36 qicosmos(江南) 阅读(3025) 评论(1) 推荐(3) 编辑

2013年10月21日

(原创)c++11改进我们的模式之改进命令模式

摘要: 模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题;比如访问者模式中循环依赖的问题等等;其它很多模式也存在这样那样的一些不足之处,如使用场景受限、实现复杂、不够简洁、不够通用等。但我觉得不足之处大都是可以采取一些手法去弥补去改进的,比如用c++11的新特性来改进。因此,便有了c++11... 阅读全文

posted @ 2013-10-21 07:43 qicosmos(江南) 阅读(4070) 评论(2) 推荐(2) 编辑

2013年10月18日

(原创)C++11改进我们的程序之move和完美转发

摘要: 本次要讲的是右值引用相关的几个函数:std::move, std::forward和成员的emplace_back,通过这些函数我们可以避免不必要的拷贝,提高程序性能。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。如图所示是深拷贝和move的区别。 这种移动语义是很有用的,比如我们一个对象中有一些指针资源或者动态数组,在对象的赋值或者拷贝时就不需要拷贝这些资源了。在c++11之前我们的拷贝构造函数和赋值函数可能要这样定义:假设一个A对象内部有一个资源m_ptr;A& A::operator=(const A& rhs){// 阅读全文

posted @ 2013-10-18 16:06 qicosmos(江南) 阅读(11515) 评论(3) 推荐(5) 编辑

2013年10月15日

(原创)C++11改进我们的程序之右值引用

摘要: 本次主要讲c++11中的右值引用,后面还会讲到右值引用如何结合std::move优化我们的程序。c++11增加了一个新的类型,称作右值引用(R-value reference),标记为T &&,说到右值引用类型之前先要了解什么是左值和右值。左值具名,对应指定内存域,可访问;右值不具名,不对应内存域,不可访问。临时对像是右值。左值可处于等号左边,右值只能放在等号右边。区分表达式的左右值属性有一个简便方法:若可对表达式用 & 符取址,则为左值,否则为右值。1.简单的赋值语句如:int i = 0;在这条语句中,i 是左值,0 是临时值,就是右值。在下面的代码中,i 可以被引 阅读全文

posted @ 2013-10-15 11:45 qicosmos(江南) 阅读(9022) 评论(2) 推荐(4) 编辑

2013年10月12日

(原创)一个简洁通用的调用DLL函数的帮助类

摘要: 本次介绍一种调用dll函数的通用简洁的方法,消除了原来调用方式的重复与繁琐,使得我们调用dll函数的方式更加方便简洁。用过dll的人会发现c++中调用dll中的函数有点繁琐,调用过程是这样的:在加载dll后还要定义一个对应的函数指针类型,再调用GetProcAddress获取函数地址,再转成函数... 阅读全文

posted @ 2013-10-12 22:48 qicosmos(江南) 阅读(4929) 评论(8) 推荐(1) 编辑

2013年10月8日

无环的visitor模式

摘要: 无环的访问者模式,是来改进原有访问者模式的不足之处的,是Robert C. Martin首次提出的。我们知道访问者模式的优点是为被访问继承体系动态添加行为,而无须改变继承体系。但是GOF访问者模式的缺点是形成了一个循环依赖,强烈的耦合了两个继承体系,使得我们修改任何一方都会对另一方造成影响,所以GOF提出,被访问者的继承体系必须是稳定的,否则,一旦被访问的继承体系修改了,两边都要改。GOF访问者模式的UML类图。从图中可以看到循环依赖,一旦被访者体系发生变化,则访问者体系就要修改,这是难以接受的。 Robert C. Martin提出了一种无环的访问者模式来改进原有的不足,通过改进后,循... 阅读全文

posted @ 2013-10-08 15:30 qicosmos(江南) 阅读(2240) 评论(0) 推荐(1) 编辑

上一页 1 ··· 3 4 5 6 7 8 9 10 下一页

导航