C++11新特性之std::function和bind绑定器

发布时间 2023-04-02 13:28:02作者: 青衣守旧人

在C++中,存在可调用对象这一个概念,可调用对象有以下几种定义:

(1).是一个函数指针

(2).是一个具有operator()成员函数的类对象(仿函数)

(3).是一个可被转换为函数指针的类对象

(4).是一个类成员(函数指针)

一、可调用对象包装器----std::function

std::function是可调用对象的包装器,它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过执行它的类模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。

#include <QCoreApplication>
#include <QDebug>

void func()
{
    qDebug() << __FUNCTION__;
}

class Foo {
public:
    static int foo_func(int a) {
        qDebug() << __FUNCTION__ <<"Foo";
        return a;
    }
};

class Bar {
public:
    int operator()(int a) {
        qDebug() <<__FUNCTION__ <<"Bar";
        return a;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    /* 绑定一个普通函数 */
    std::function<void()> fr1 = func;
    fr1();

    /* 绑定一个类的静态成员函数 */
    std::function<int(int)> fr2 = Foo::foo_func;
    qDebug() << fr2(123);

    /* 绑定一个仿函数 */
    Bar bar;
    fr2 = bar;
    qDebug() << fr2(123);

    return a.exec();
}

运行结果如下:

 

 再来看下面的示例:

#include <QCoreApplication>
#include <QDebug>

class A {
public:
    A(const std::function<void()>& f):callback_(f){};
    void notify() {
        callback_(); /* 回调到上层 */
    }

private:
    std::function<void()> callback_;
};

class Foo {
public:
    void operator()() {
        qDebug() <<__FUNCTION__;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Foo foo;
    A aa(foo);
    aa.notify();

    return a.exec();
}

从上面的示例中可以看出,std::function可以取代函数指针的作用,因为它可以保存函数延迟执行,所以比较适合作为回调函数。