自己写的function/bind应用于不支持C++11的编译器

原本打算写一篇描述stl::function/bind原理以及实现的博文,结果却发现已经有人写过了,lvan100 [http://blog.csdn.net/lvan100/article/details/7831762?utm_source=tuicool],其中的各个地方都解释的很好,我就发现我没有写这篇博文的必要了,咋办,既然开始了,那就随便写点呗。

我实现了一份类似std::function/bind/shared_ptr功能的函数,并附带了一个小例子[code].

写这玩意的初衷是公司要开发一套嵌入式的产品,上面使用了QT,结果产品还没有发布,就发现程序运行了几天就会出现异常,排查了好久,发现我用源码编译的QT底层的QMutex锁不上,我也排查过我的编译脚本,实在看不出来问题,只能想其他办法解决这个问题,如果仅仅是锁不了,倒也没什么大不了的问题,关键的是跨线程发送消息的时候,emit底层使用的锁也锁不住,这个我就控制不住了,所以这个跨线程emit只能废弃不用,如何处理呢?我只能把要emit替换成一个消息绑定一个函数,这样修改起来最方便,所有的QT相关的操作都放在同一个线程中,长跑了好久,这个异常终于解决了,总算松了一口气呀。

上面说了,用一个消息绑定一个函数,如何就能快速替换跨线程emit呢?这就要使用function了,function+bind使用起来有什么样的好处呢?我们平时要调用类的成员函数,那就必须要拿到这个类的对象或者指针,然后调用,试想一下,一个消息响应到某个类的成员函数,就必需在调用的地方声明类以及类的指针,这样用起来,极其不便,当然也不容易做封装,再者么所有需要接收消息的类都继承自某个共同的基类,基类提供一个虚函数,类似windows上的windowproc函数,有个消息号以及另个参数,但这样修改起来非常费事,改动量也很大。

平时我在Windows上开发应用程序时,都会用到stl::function/bind,这两个东西,用起来非常方便,一旦你用过了,就舍不得丢弃了,这两个东西的初衷是将某个类的成员函数封装成一个类,就是function的模板类,然后随便传到哪个地方,就像是一个普通的函数指针一样,在不知道具体是哪个类、类的对象情况下,就可以直接调用了某个类的成员函数,多么方便呀。那我的思路就来了,我封装一个管理类,专门做一个消息绑定一个function的函数(你绝对可以看做是一个函数指针),当响应这个消息的时候,将这消息压入队列,QT的界面线程会在空闲的时候轮训这个队列,然后直接调用函数指针,也可以一个消息绑定多个函数指针,这个就不用我来说了吧。

然而公司的交叉编译工具恰恰又不支持C++11,郁闷吧,不能使用原生态的stl::function,怎么办,思路都有了,那就自己写一个类似function函数呗。好在VS是提供function的实现源码的,你可以单步进去看,lvan100在12年就写过博文,来描述function的实现,写的很好,大家可以去看看,其中他说道明明function申明的地方只是一个typename _Fty,但是真正用的地方却是可变参数的,其实这个就是模板的特化,我的源码中也给出了一个小例子,大家看了就会明白大概是什么状况了。还是简单的列一下吧,这个是我在网上抄的,忘记在哪抄的,原作者看见了不要轰我啊:

template<typename T>
struct A
{
	T num;
public:
	A(){
		num=T(6.6);
	}
	void print(){
		cout<<"A'num:"<<num<<endl;
	}
};


template<typename T0, typename T1>
struct A<T0(T1)>
{
	char* str;
public:
	A(){
		str="A' special definition ";
	}
	void print(){
		cout<<str<<endl;
	}
};
	A<int> a1; //显示模板实参的隐式实例化
	a1.print();
	A<char(char)> a2;//使用特化的类模板
	a2.print();

最开心的就是我的arm系统上终于也能跑了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值