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;
}
结果如下:
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。