Clang3.6版本中的CheckerFn

发布时间:2020-07-17 14:55:32 作者:風子余
来源:网络 阅读:1030

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





推荐阅读:
  1. linux中如何升级sudo的版本
  2. [C++模板]Clang3.9使用变参模拟实现CheckerFn和Checker

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ clang he

上一篇:解决mysql启动报错误1067的问题

下一篇:Script error.深度测试

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》