C++ 中的
库用于 函数对象 和 回调函数 的处理,功能非常强大,能够让我们更加灵活地操作函数和其他可调用对象。
库?
是 C++ 标准库中的一个头文件,包含了用于处理 函数对象(functor) 和 回调函数 的工具。它让我们能够更加灵活地操作函数,尤其是那些作为参数传递或返回值的函数。
std::function
:存储任意类型的可调用对象(函数、lambda、函数指针等)。std::bind
:用于绑定函数的参数,创建一个新的函数对象。std::placeholders
:用于 std::bind
,指定参数的位置。std::mem_fn
:用于将成员函数包装成可调用的对象。std::function
std::function
是
库中最核心的部分,它提供了一种通用的方式来存储和调用任何类型的可调用对象,包括普通函数、成员函数、lambda 表达式、函数对象等。
std::function
是一个模板类,用于存储任意类型的函数或可调用对象,具有一致的调用接口。
#include
#include
void hello() {
std::cout << "Hello, world!" << std::endl;
}
int add(int a, int b) {
return a + b;
}
int main() {
// 存储普通函数
std::function func = hello;
func(); // 输出 Hello, world!
// 存储带参数的函数
std::function addFunc = add;
std::cout << addFunc(3, 4) << std::endl; // 输出 7
return 0;
}
解释:
std::function
用来存储没有参数且没有返回值的函数 hello
。std::function
用来存储带有两个 int
参数并返回 int
的函数 add
。std::function
可以存储各种类型的函数,包括普通函数、成员函数、lambda、甚至是函数指针和函数对象。#include
#include
int main() {
// 存储 lambda 表达式
std::function multiply = [](int a, int b) { return a * b; };
std::cout << multiply(3, 4) << std::endl; // 输出 12
return 0;
}
std::bind
std::bind
用于绑定函数的参数,它可以预先提供部分参数,返回一个新的可调用对象。
std::bind
创建一个新的函数对象,可以指定某些参数值,并返回一个新的函数对象,部分应用 参数。#include
#include
int add(int a, int b) {
return a + b;
}
int main() {
// 将 add 函数的第一个参数绑定为 5
auto add5 = std::bind(add, 5, std::placeholders::_1);
std::cout << add5(3) << std::endl; // 输出 8,等价于 add(5, 3)
return 0;
}
解释:
std::bind(add, 5, std::placeholders::_1)
创建了一个新的函数对象 add5
,它将 add
函数的第一个参数绑定为 5
,第二个参数使用占位符 _1
来等待传递。std::placeholders
:std::placeholders
是一个特殊的命名空间,用来表示待绑定的位置。std::placeholders::_1
表示绑定函数的第一个参数,_2
表示第二个参数,以此类推。std::mem_fn
std::mem_fn
用于将成员函数包装成可调用对象。它可以将成员函数转化为普通的函数对象,方便传递和调用。
std::mem_fn
是一个函数模板,它可以将成员函数包装成函数对象,之后可以像调用普通函数一样调用成员函数。
#include
#include
class MyClass {
public:
void sayHello() {
std::cout << "Hello from MyClass!" << std::endl;
}
};
int main() {
MyClass obj;
// 使用 std::mem_fn 创建一个可调用的成员函数对象
std::function func = std::mem_fn(&MyClass::sayHello);
func(); // 输出 "Hello from MyClass!"
return 0;
}
解释:
std::mem_fn(&MyClass::sayHello)
将 MyClass
的成员函数 sayHello
转换成了一个函数对象。func()
调用该成员函数。std::function
在回调和事件处理中的应用std::function
让我们能够更加灵活地处理 回调函数,这是在异步编程、事件驱动编程中的常见用法。
#include
#include
void printMessage(const std::string& msg) {
std::cout << msg << std::endl;
}
void executeCallback(std::function callback) {
callback("Hello, callback!");
}
int main() {
// 将函数 printMessage 作为回调传入
executeCallback(printMessage); // 输出 "Hello, callback!"
return 0;
}
解释:
std::function
存储一个接受 std::string
参数并返回 void
的函数(回调函数)。executeCallback
函数接受一个回调函数并调用它。std::function
:允许你存储任何类型的可调用对象(普通函数、lambda、成员函数、函数对象等),并统一使用相同的接口进行调用。std::bind
:用于部分绑定函数参数,返回一个新的可调用对象。std::mem_fn
:将成员函数包装为可调用对象,方便在算法中传递和调用。通过
,C++ 能够支持类似于现代编程语言中的高阶函数、回调和 lambda 表达式等特性,为你的代码提供更大的灵活性和扩展性!(•̀ω•́)✧