重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
CheckerFn中的注册函数与仿函数
成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都做网站、新昌网络推广、微信小程序开发、新昌网络营销、新昌企业策划、新昌品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供新昌建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
一,C++仿函数
就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
二,C++特化和偏特化
特化:针对特定的类型,需要对模板进行特化,也就是特殊处理
偏特化:根据模板的某些但不是全部的参数进行特化
Clang3.6版本的CheckerFn,首先声明了CheckerFn类模板。接下来分别对5个,4个,3个,2个,1个和0个参数的类模板进行偏特化定义实现。Clang3.6的CheckerFn源码如下:
templateclass CheckerFn; template class CheckerFn { typedef RET (*Func)(void *, P1, P2, P3, P4, P5); Func Fn; public: CheckerBase *Checker; CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } RET operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { return Fn(Checker, p1, p2, p3, p4, p5); } }; template class CheckerFn { typedef RET (*Func)(void *, P1, P2, P3, P4); Func Fn; public: CheckerBase *Checker; CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } RET operator()(P1 p1, P2 p2, P3 p3, P4 p4) const { return Fn(Checker, p1, p2, p3, p4); } }; template class CheckerFn { typedef RET (*Func)(void *, P1, P2, P3); Func Fn; public: CheckerBase *Checker; CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } RET operator()(P1 p1, P2 p2, P3 p3) const { return Fn(Checker, p1, p2, p3); } }; template class CheckerFn { typedef RET (*Func)(void *, P1, P2); Func Fn; public: CheckerBase *Checker; CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } RET operator()(P1 p1, P2 p2) const { return Fn(Checker, p1, p2); } }; template class CheckerFn { typedef RET (*Func)(void *, P1); Func Fn; public: CheckerBase *Checker; CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } RET operator()(P1 p1) const { return Fn(Checker, p1); } }; template class CheckerFn { typedef RET (*Func)(void *); Func Fn; public: CheckerBase *Checker; CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } RET operator()() const { return Fn(Checker); } };
三,模拟实现注册函数与仿函数结合的功能
头文件如下
/******************************* * * Author : szyu * * Date : 2017.1.3 * **********************************/ #ifndef __SZYU_TEMPLATE__ #define __SZYU_TEMPLATE__ #includetemplate class Call; template class Call { private: typedef T (*Func)(); Func Fn; public: Call() { std::cout << "In Call::Call()" << std::endl; } Call( Func f ) : Fn( f ) { std::cout << "In Call::Call(Func f)" << std::endl; } T operator()() const { Fn(); } }; template class Call { private: typedef T (*Func)(U1); Func Fn; public: Call() { std::cout << "In Call::Call()" << std::endl; } Call( Func f ) : Fn( f ) { std::cout << "In Call::Call(Func f)" << std::endl; } T operator()( U1 u ) const { Fn( u ); } }; template class Call { private: typedef T (*Func)(U1, U2); Func Fn; public: Call() { std::cout << "In Call::Call()" << std::endl; } Call( Func f ) : Fn( f ) { std::cout << "In Call::Call(Func f)" << std::endl; } T operator()( U1 u1, U2 u2 ) const { Fn( u1, u2 ); } }; #endif
测试用例如下:
/************************** * * Author : szyu * * Date : 2017.1.3 * ****************************/ #include "callback.h" void func1() { std::cout << "In func1" << std::endl; } void func2( int val ) { std::cout << "arg..." << val << std::endl; std::cout << "In func2" << std::endl; } void func3( int val, char ch ) { std::cout << "args1..." << val << ", args2..." << ch << std::endl; std::cout << "In func3" << std::endl; } void test1() { std::cout << "**********Call***********" << std::endl; typedef Call CallOne; CallOne call( func1 ); call(); std::cout << "**********Call ***********" << std::endl; typedef Call CallTwo; CallTwo call2( func2 ); int args = 7; call2( args ); std::cout << "**********Call ***********" << std::endl; typedef Call CallThree; CallThree call3( func3 ); args = 8; char ch = 'A'; call3( args, ch ); } int main( int argc, char *argv[] ) { test1(); return 0; }
结果如下: