Clang3.6版本中的CheckerFn

2017-01-04 12:11:01来源:作者:人点击

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"voidfunc1(){ std::cout << "In func1" << std::endl;}voidfunc2( int val ){ std::cout << "arg..." << val << std::endl; std::cout << "In func2" << std::endl;}voidfunc3( int val, char ch ){ std::cout << "args1..." << val << ", args2..." << ch << std::endl; std::cout << "In func3" << std::endl;}voidtest1(){ 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 );}intmain( int argc, char *argv[] ){ test1();return 0;}
结果如下:



本文出自 “11988200” 博客,请务必保留此出处http://11998200.blog.51cto.com/11988200/1888745

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台