std::function
和std::bind
是C++11引入的功能强大的库组件,用于处理函数对象和函数调用的高级操作。它们极大地增强了C++处理回调、函数指针和函数对象的能力。
std::function
std::function
是一个通用的、多态的函数封装器,可以容纳任何可调用的目标------包括普通函数、lambda表达式、函数对象和成员函数指针。
主要特性:
- 类型安全 :
std::function
封装的可调用对象具有类型安全性。 - 可存储、复制和传递 :可以像其他标准库对象一样存储、复制和传递
std::function
对象。 - 通用性:可以存储各种类型的可调用对象。
语法:
cpp
#include <functional>
#include <iostream>
// 定义一个std::function对象,可以容纳返回值为void,参数为int的可调用对象
std::function<void(int)> func;
示例:
cpp
#include <iostream>
#include <functional>
// 普通函数
void freeFunction(int n) {
std::cout << "Free function called with " << n << '\n';
}
// 函数对象
struct Functor {
void operator()(int n) {
std::cout << "Functor called with " << n << '\n';
}
};
int main() {
// 使用std::function存储普通函数
std::function<void(int)> func = freeFunction;
func(10);
// 使用std::function存储函数对象
func = Functor();
func(20);
// 使用std::function存储lambda表达式
func = [](int n) { std::cout << "Lambda called with " << n << '\n'; };
func(30);
return 0;
}
std::bind
std::bind
用于将函数和参数绑定在一起,从而创建一个新的函数对象。这对于创建部分应用函数或固定某些参数的回调非常有用。
主要特性:
- 参数绑定:可以绑定部分或全部参数。
- 返回函数对象:返回一个可以像普通函数对象一样调用的对象。
语法:
cpp
#include <functional>
#include <iostream>
// 使用std::bind绑定参数
auto boundFunc = std::bind(targetFunc, arg1, arg2, ...);
示例:
cpp
#include <iostream>
#include <functional>
// 普通函数
void freeFunction(int a, int b) {
std::cout << "Free function called with " << a << " and " << b << '\n';
}
int main() {
// 使用std::bind绑定第一个参数为10
auto boundFunc = std::bind(freeFunction, 10, std::placeholders::_1);
boundFunc(20); // 调用时只需要传递第二个参数
// 使用std::bind绑定所有参数
auto fullyBoundFunc = std::bind(freeFunction, 30, 40);
fullyBoundFunc(); // 调用时不需要传递任何参数
return 0;
}
占位符:
std::placeholders::_1
, std::placeholders::_2
等占位符用于表示未绑定的参数位置。在调用新函数对象时,这些位置会被传递给它的参数所替代。
std::function
和std::bind
结合使用:
std::function
和std::bind
可以结合使用,以创建更加灵活和强大的函数对象。
示例:
cpp
#include <iostream>
#include <functional>
// 普通函数
void freeFunction(int a, int b) {
std::cout << "Free function called with " << a << " and " << b << '\n';
}
int main() {
// 使用std::bind绑定参数
auto boundFunc = std::bind(freeFunction, 10, std::placeholders::_1);
// 使用std::function存储绑定后的函数对象
std::function<void(int)> func = boundFunc;
func(20); // 调用时只需要传递一个参数
return 0;
}
在这个示例中,std::bind
创建了一个绑定第一个参数的函数对象,而std::function
将其存储并调用。这展示了std::function
和std::bind
的强大组合,可以用于创建灵活的回调和函数处理机制。