博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用C++11 std::bind和std::function实现回调机制
阅读量:7165 次
发布时间:2019-06-29

本文共 1923 字,大约阅读时间需要 6 分钟。


#include <functional>

#include <iostream>



#define
 MY_CALLBACK_0(__selector__,__target__, 
) std::bind(&__selector__,__target__, ##__VA_ARGS__)

#define
 MY_CALLBACK_1(__selector__,__target__, 
) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)

#define
 MY_CALLBACK_2(__selector__,__target__, 
) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)

#define
 MY_CALLBACK_3(__selector__,__target__, 
) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)



typedef std::function<
void
()> CALLBACK_FUNC;


class
 Sender

{

public
:

    Sender() { callback = nullptr; }

    
virtual
 ~Sender() {}


public
:

    
void
 emit()

    {

        std::cout << "I am A,I send a message." << std::endl;

        
if
 (callback) callback();

    }


    
void
 setTarget(CALLBACK_FUNC target)

    {

        callback = target;

    }


public
:

    CALLBACK_FUNC callback;

};


struct
 foo

{

    
void
 doSomething_MemberFunction() 
const

    {

        std::cout << "I am member function,I got a message!" << std::endl;

    }


    
static
 
void
 doSomething_StaticMemberFunction(
int
 i)

    {

        std::cout << "I am static member function,I got a message! i=" << i << std::endl;

    }

};


void
 doSomething_GlobalFunction()

{

    std::cout << "I am global function,I got a message!" << std::endl;

}


class
 Functor

{

public
:

    
void
 
operator
()()

    {

        std::cout << "I am a functor!" << std::endl;

    }

};


void
 testBindFunction()

{

    Sender sender;

    foo f;


    
//
 成员函数
    sender.setTarget(std::bind(&foo::doSomething_MemberFunction, &f));

    
//
sender.setTarget(MY_CALLBACK_0(foo::doSomething_MemberFunction, &f));
    sender.emit();


    
//
 全局函数
    sender.setTarget(doSomething_GlobalFunction);

    sender.emit();


    
//
 静态成员函数
    sender.setTarget(std::bind(foo::doSomething_StaticMemberFunction, 666));

    sender.emit();


    
//
 Lambda表达式
    auto lambda = []() { std::cout << "I am Lambda!" << std::endl; };

    sender.setTarget(lambda);

    sender.emit();


    
//
 仿函数
    sender.setTarget(Functor());

    sender.emit();

}

转载地址:http://edxwm.baihongyu.com/

你可能感兴趣的文章
su root 和su - root 的区别
查看>>
并查集 POJ 1611 The Suspects
查看>>
一个奥运奖牌榜的小调用
查看>>
C++ 文件复制
查看>>
TYVJ P1082 找朋友 Label:字符串
查看>>
Ambari 介绍
查看>>
Guess Number
查看>>
在Eclipse中配置Tomcat 创建和运行Servlet/JSP
查看>>
Javascript:DOM动态创建元素实例应用
查看>>
jQuery操作cookie
查看>>
11-03笔记图
查看>>
时间戳解读
查看>>
width为auto或者100%的区别
查看>>
《贝多芬传》译者序
查看>>
node.js的koa@2性能测试
查看>>
matlab函数_连通区域
查看>>
伪元素选择器
查看>>
Java过滤敏感词
查看>>
java多线程导入excel(poi)
查看>>
UML类间关系
查看>>