中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Clang3.6版本中的CheckerFn

發布時間:2020-07-17 14:55:32 來源:網絡 閱讀:1029 作者:風子余 欄目:編程語言

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;
}

結果如下:

Clang3.6版本中的CheckerFn





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五华县| 黄平县| 海门市| 海兴县| 绥江县| 无棣县| 于田县| 周口市| 当雄县| 都兰县| 长垣县| 浠水县| 兰考县| 绥宁县| 古浪县| 专栏| 渝北区| 固阳县| 南开区| 西盟| 永定县| 宁远县| 鸡泽县| 靖安县| 德昌县| 田阳县| 绥滨县| 伊宁县| 临潭县| 崇明县| 旺苍县| 武安市| 慈溪市| 三亚市| 神池县| 荔波县| 东丰县| 中山市| 资兴市| 台前县| 莆田市|