目录
1. 函数对象基类
std::function
一个通用的函数包装器,可以存储、复制和调用任何可调用对象(如函数、lambda 表达式、函数指针、仿函数等)。
示例:
#include <functional>
#include <iostream>
void print() { std::cout << "Hello\n"; }
int main() {
std::function<void()> f = print; // 包装函数
f(); // 调用
return 0;
}
2. 绑定器
std::bind
用于将函数的参数绑定到特定值,或重新排列参数顺序,返回一个新的可调用对象。
示例:
#include <functional>
#include <iostream>
void add(int a, int b) { std::cout << a + b << "\n"; }
int main() {
auto f = std::bind(add, 10, std::placeholders::_1); // 绑定 a=10,b 留空
f(5); // 输出 15
return 0;
}
std::placeholders::_1
,_2
, … 是占位符,表示未绑定的参数。
3. 预定义的函数对象
<functional>
提供了一些内置的函数对象,用于常见的运算:
- 算术运算:
std::plus
,std::minus
,std::multiplies
,std::divides
,std::modulus
,std::negate
- 比较运算:
std::equal_to
,std::not_equal_to
,std::greater
,std::less
,std::greater_equal
,std::less_equal
- 逻辑运算:
std::logical_and
,std::logical_or
,std::logical_not
- 位运算:
std::bit_and
,std::bit_or
,std::bit_xor
,std::bit_not
示例:
#include <functional>
#include <iostream>
int main() {
std::plus<int> add; // 加法函数对象
std::cout << add(3, 4) << "\n"; // 输出 7
return 0;
}
4. 函数适配器
std::ref
和std::cref
用于创建引用包装器,避免拷贝,通常与std::bind
或其他需要引用的场景配合使用。
示例:
#include <functional>
#include <iostream>
void increment(int& x) { x++; }
int main() {
int a = 5;
auto f = std::bind(increment, std::ref(a)); // 传递引用
f();
std::cout << a << "\n"; // 输出 6
return 0;
}
5. 其他工具
std::mem_fn
用于将成员函数包装成可调用对象。
示例:
#include <functional>
#include <iostream>
struct MyClass {
void print() { std::cout << "Hello\n"; }
};
int main() {
MyClass obj;
auto f = std::mem_fn(&MyClass::print);
f(obj); // 输出 "Hello"
return 0;
}
6. 注意事项
<functional>
中的工具在现代 C++ 中常与 lambda 表达式结合使用,lambda 在许多场景下可以替代std::bind
和函数对象。- 使用
std::function
和std::bind
时会有一定的性能开销,适用于需要灵活性而非极致性能的场景。
7. 参考资料
以下是一些权威的参考资料链接,帮助你深入了解 <functional>
:
- C++ Reference –
<functional>
详细的官方文档,包含所有函数和类的说明及示例。 - Microsoft C++ Documentation –
<functional>
Microsoft 提供的标准库文档,适合快速查阅。 - GNU libstdc++ Documentation
GCC 的标准库实现文档,适合了解底层细节。
如果你有具体问题或需要更详细的代码示例,可以告诉我,我会进一步协助你!
发表回复