Clang3.6版本中的CheckerFn
CheckerFn中的注册函数与仿函数
一,C++仿函数
就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
二,C++特化和偏特化
特化:针对特定的类型,需要对模板进行特化,也就是特殊处理
偏特化:根据模板的某些但不是全部的参数进行特化
Clang3.6版本的CheckerFn,首先声明了CheckerFn类模板。接下来分别对5个,4个,3个,2个,1个和0个参数的类模板进行偏特化定义实现。Clang3.6的CheckerFn源码如下:
template<typenameT>classCheckerFn;template<typenameRET,typenameP1,typenameP2,typenameP3,typenameP4,typenameP5>classCheckerFn<RET(P1,P2,P3,P4,P5)>{typedefRET(*Func)(void*,P1,P2,P3,P4,P5);FuncFn;public:CheckerBase*Checker;CheckerFn(CheckerBase*checker,Funcfn):Fn(fn),Checker(checker){}REToperator()(P1p1,P2p2,P3p3,P4p4,P5p5)const{returnFn(Checker,p1,p2,p3,p4,p5);}};template<typenameRET,typenameP1,typenameP2,typenameP3,typenameP4>classCheckerFn<RET(P1,P2,P3,P4)>{typedefRET(*Func)(void*,P1,P2,P3,P4);FuncFn;public:CheckerBase*Checker;CheckerFn(CheckerBase*checker,Funcfn):Fn(fn),Checker(checker){}REToperator()(P1p1,P2p2,P3p3,P4p4)const{returnFn(Checker,p1,p2,p3,p4);}};template<typenameRET,typenameP1,typenameP2,typenameP3>classCheckerFn<RET(P1,P2,P3)>{typedefRET(*Func)(void*,P1,P2,P3);FuncFn;public:CheckerBase*Checker;CheckerFn(CheckerBase*checker,Funcfn):Fn(fn),Checker(checker){}REToperator()(P1p1,P2p2,P3p3)const{returnFn(Checker,p1,p2,p3);}};template<typenameRET,typenameP1,typenameP2>classCheckerFn<RET(P1,P2)>{typedefRET(*Func)(void*,P1,P2);FuncFn;public:CheckerBase*Checker;CheckerFn(CheckerBase*checker,Funcfn):Fn(fn),Checker(checker){}REToperator()(P1p1,P2p2)const{returnFn(Checker,p1,p2);}};template<typenameRET,typenameP1>classCheckerFn<RET(P1)>{typedefRET(*Func)(void*,P1);FuncFn;public:CheckerBase*Checker;CheckerFn(CheckerBase*checker,Funcfn):Fn(fn),Checker(checker){}REToperator()(P1p1)const{returnFn(Checker,p1);}};template<typenameRET>classCheckerFn<RET()>{typedefRET(*Func)(void*);FuncFn;public:CheckerBase*Checker;CheckerFn(CheckerBase*checker,Funcfn):Fn(fn),Checker(checker){}REToperator()()const{returnFn(Checker);}};
三,模拟实现注册函数与仿函数结合的功能
头文件如下
/*********************************Author:szyu**Date:2017.1.3***********************************/#ifndef__SZYU_TEMPLATE__#define__SZYU_TEMPLATE__#include<iostream>template<typenameT>classCall;template<typenameT>classCall<T()>{private:typedefT(*Func)();FuncFn;public:Call(){std::cout<<"InCall::Call()"<<std::endl;}Call(Funcf):Fn(f){std::cout<<"InCall::Call(Funcf)"<<std::endl;}Toperator()()const{Fn();}};template<typenameT,typenameU1>classCall<T(U1)>{private:typedefT(*Func)(U1);FuncFn;public:Call(){std::cout<<"InCall::Call()"<<std::endl;}Call(Funcf):Fn(f){std::cout<<"InCall::Call(Funcf)"<<std::endl;}Toperator()(U1u)const{Fn(u);}};template<typenameT,typenameU1,typenameU2>classCall<T(U1,U2)>{private:typedefT(*Func)(U1,U2);FuncFn;public:Call(){std::cout<<"InCall::Call()"<<std::endl;}Call(Funcf):Fn(f){std::cout<<"InCall::Call(Funcf)"<<std::endl;}Toperator()(U1u1,U2u2)const{Fn(u1,u2);}};#endif
测试用例如下:
/****************************Author:szyu**Date:2017.1.3*****************************/#include"callback.h"voidfunc1(){std::cout<<"Infunc1"<<std::endl;}voidfunc2(intval){std::cout<<"arg..."<<val<<std::endl;std::cout<<"Infunc2"<<std::endl;}voidfunc3(intval,charch){std::cout<<"args1..."<<val<<",args2..."<<ch<<std::endl;std::cout<<"Infunc3"<<std::endl;}voidtest1(){std::cout<<"**********Call<void()>***********"<<std::endl;typedefCall<void()>CallOne;CallOnecall(func1);call();std::cout<<"**********Call<void(int)>***********"<<std::endl;typedefCall<void(int)>CallTwo;CallTwocall2(func2);intargs=7;call2(args);std::cout<<"**********Call<void(int,char)>***********"<<std::endl;typedefCall<void(int,char)>CallThree;CallThreecall3(func3);args=8;charch='A';call3(args,ch);}intmain(intargc,char*argv[]){test1();return0;}
结果如下:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。