在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可以取代函数指针的作用,因为它可以保存函数延迟执行,所以比较适合作为回调函数。
标签:11,std,函数,function,对象,函数指针,include From: https://www.cnblogs.com/QingYiShouJiuRen/p/17280312.html