使用C++11 std::bind和std::function实现回调机制

简介:

#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();
}
目录
相关文章
|
23天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
52 0
|
2月前
|
存储 安全 编译器
【c++】深入理解别名机制--引用
本文介绍了C++中的引用概念及其定义、特性、实用性和与指针的区别。引用是C++中的一种别名机制,通过引用可以实现类似于指针的功能,但更安全、简洁。文章详细解释了引用的定义方式、引用传参和返回值的应用场景,以及常引用的使用方法。最后,对比了引用和指针的异同,强调了引用在编程中的重要性和优势。
44 1
|
3月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
81 6
|
3月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
101 7
|
4月前
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
76 9
|
4月前
|
存储 编译器 调度
C++ 11新特性之bind
C++ 11新特性之bind
40 1
|
3月前
|
C++ 容器
函数对象包装器function和bind机制
函数对象包装器function和bind机制
28 0
|
4月前
|
安全 C++
C++: std::once_flag 和 std::call_once
`std::once_flag` 和 `std::call_once` 是 C++11 引入的同步原语,确保某个函数在多线程环境中仅执行一次。
|
6月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
63 6
|
6月前
|
C++ 运维
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
开发与运维编译问题之在C++中在使用std::mutex后能自动释放锁如何解决
83 2