Clang3.6版本中的CheckerFn

CheckerFn中的注册函数与仿函数

成都创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都做网站、新昌网络推广、微信小程序开发、新昌网络营销、新昌企业策划、新昌品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联为所有大学生创业者提供新昌建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

一,C++仿函数

        就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

二,C++特化和偏特化

特化:针对特定的类型,需要对模板进行特化,也就是特殊处理

偏特化:根据模板的某些但不是全部的参数进行特化


Clang3.6版本的CheckerFn,首先声明了CheckerFn类模板。接下来分别对5个,4个,3个,2个,1个和0个参数的类模板进行偏特化定义实现。Clang3.6的CheckerFn源码如下:

template  class CheckerFn;

template 
class CheckerFn {
  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 
class CheckerFn {
  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 
class CheckerFn {
  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 
class CheckerFn {
  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 
class CheckerFn {
  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 
class CheckerFn {
  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 

template  class Call;

template 
class Call
{
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 
class Call
{
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 
class Call
{
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***********" << std::endl;
    typedef Call CallOne;
    CallOne call( func1 );
    call();

    std::cout << "**********Call***********" << std::endl;
    typedef Call CallTwo;
    CallTwo call2( func2 );
    
    int args = 7;
    call2( args );

    std::cout << "**********Call***********" << std::endl;
    typedef Call CallThree;
    CallThree call3( func3 );

    args = 8;
    char ch = 'A';
    call3( args, ch );
}

int
main( int argc, char *argv[] )
{
    test1();
    
    return 0;
}

结果如下:

Clang3.6版本中的CheckerFn


网站标题:Clang3.6版本中的CheckerFn
本文路径:http://azwzsj.com/article/ggdoss.html