跳到主要内容

std::function

std::function 是C++11引入的类模板包装器,可以用来存储可调用对象 。使用该模板类需要导入 functional 头文件。
前面提到 std::function 可以存储可调用对象,那么什么是可调用对象呢? 简单来说可调用对象是指可以像函数一样被调用的实体,以下给出几个例子。

函数指针

int (*func)(int ,int)

重载了()运算符的类

class A{
public:
void operator()(){
cout << "operator()" << endl;
}
};

lambda表达式

auto func = []{
cout << "lambda" << endl;
}

使用

现在围绕上述的几个类型展示function的简单使用:

#include <iostream>
#include <functional>

struct A {
void operator()() {
std::cout << "operator()\n";
}
};

void func() {
std::cout << "function\n";
}

int main() {
std::function<void(void)> f = A{};
f(); // 输出 "operator()"

f = []{
std::cout << "lambda\n";
};
f(); // 输出 ”lambda“

f = func;
f(); // 输出 ”function“
}

可以观察到,尖括号里面是写的 void(void), 在模板中尖括号里面写的是 类型,这种类似 void(void) 的叫做函数类型,代表一个返回 void,参数类型 是 void的函数,同理如果我有一个函数是int func(int, int) 那么所对应的函数类型就是int(int, int)。