[C/C++] C++11前后回调函数实现方式的差异

c++11前后, 关于函数回调的调用方式.

#include <iostream>
#include <functional>

void general_func() {
    std::cout << "call general_func" << std::endl;
}

class obj {
public:
    void member_func() {
        std::cout << "call obj::member_func" << std::endl;
    }

    static void static_member_func() {
        std::cout << "call obj::static_member_func" << std::endl;
    }
};

int main() {
    // 在c++11之前, 使用函数指针来实现函数回调
    typedef void (*general_func_callback)(); // = using general_func_callback = void(*)();
    typedef void (obj::* obj_member_func_callback)(); // using obj_member_func_callback = void(obj::*)();

    general_func_callback general_func_cb = general_func; // 此处 general_func = &general_func = *general_func
    general_func_cb(); // 普通函数回调

    obj object;
    obj_member_func_callback member_func_cb = &obj::member_func; // 注意: & 是必要的
    (object.*member_func_cb)(); // 注意: 类成员函数的回调方式, 括号是必须的

    general_func_callback general_func_cb = obj::static_member_func;
    general_func_cb(); // 注意: 类静态成员函数回调 与 普通函数回调无异

    // 在c++11之后, 使用std::function/std::bind来实现函数回调则更灵活方便
    using std_func_callback = std::function<void()>;

    std_func_callback std_func_cb; // 灵活体现在统一封装了回调形式std::function<void()>, 方便体现在统一了调用方式std_func_cb()
    std_func_cb = std::bind(general_func);
    std_func_cb();
    std_func_cb = std::bind(&obj::member_func, object);
    std_func_cb(); // 对比上面通过函数指针调用成员函数, 上边明显更容易写错
    std_func_cb = std::bind(obj::static_member_func);
    std_func_cb();

    return 0;
}

发表评论

电子邮件地址不会被公开。必填项已用 * 标注