使用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();
}
目录
相关文章
|
1天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
11 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
2月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
106 0
|
3月前
|
存储 安全 编译器
【c++】深入理解别名机制--引用
本文介绍了C++中的引用概念及其定义、特性、实用性和与指针的区别。引用是C++中的一种别名机制,通过引用可以实现类似于指针的功能,但更安全、简洁。文章详细解释了引用的定义方式、引用传参和返回值的应用场景,以及常引用的使用方法。最后,对比了引用和指针的异同,强调了引用在编程中的重要性和优势。
59 1
|
4月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
97 6
|
4月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
127 7
|
5月前
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
116 9
|
5月前
|
存储 编译器 调度
C++ 11新特性之bind
C++ 11新特性之bind
48 1
|
5月前
|
安全 C++
C++: std::once_flag 和 std::call_once
`std::once_flag` 和 `std::call_once` 是 C++11 引入的同步原语,确保某个函数在多线程环境中仅执行一次。
|
7月前
|
C++ 运维
开发与运维函数问题之使用std::function实现回调函数的示例如何解决
开发与运维函数问题之使用std::function实现回调函数的示例如何解决
53 7
|
7月前
|
存储 C++ 运维
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
开发与运维函数问题之使用C++标准库中的std::function来简化回调函数的使用如何解决
72 6