您好,登錄后才能下訂單哦!
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。