CheckerFn中的注册函数与仿函数
一,C++仿函数
就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
二,C++特化和偏特化
特化:针对特定的类型,需要对模板进行特化,也就是特殊处理
偏特化:根据模板的某些但不是全部的参数进行特化
Clang3.6版本的CheckerFn,首先声明了CheckerFn类模板。接下来分别对5个,4个,3个,2个,1个和0个参数的类模板进行偏特化定义实现。Clang3.6的CheckerFn源码如下:
template <typename T> class CheckerFn; template <typename RET, typename P1, typename P2, typename P3, typename P4, typename P5> class CheckerFn<RET(P1, P2, P3, P4, P5)> { 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 <typename RET, typename P1, typename P2, typename P3, typename P4> class CheckerFn<RET(P1, P2, P3, P4)> { 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 <typename RET, typename P1, typename P2, typename P3> class CheckerFn<RET(P1, P2, P3)> { 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 <typename RET, typename P1, typename P2> class CheckerFn<RET(P1, P2)> { 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 <typename RET, typename P1> class CheckerFn<RET(P1)> { 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 <typename RET> class CheckerFn<RET()> { 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__ #include <iostream> template <typename T> class Call; template <typename T> class Call<T()> { 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 <typename T, typename U1> class Call<T(U1)> { 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 <typename T, typename U1, typename U2> class Call<T(U1, U2)> { 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<void ()>***********" << std::endl; typedef Call<void ()> CallOne; CallOne call( func1 ); call(); std::cout << "**********Call<void (int)>***********" << std::endl; typedef Call<void (int)> CallTwo; CallTwo call2( func2 ); int args = 7; call2( args ); std::cout << "**********Call<void (int, char)>***********" << std::endl; typedef Call<void (int, char)> CallThree; CallThree call3( func3 ); args = 8; char ch = 'A'; call3( args, ch ); } int main( int argc, char *argv[] ) { test1(); return 0; }
结果如下:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。