匿名函数定义一次性局部函数,适用于传递函数指针或 lambda 表达式给函数或对象。函数对象是用函数调用运算符重载的类或结构体,适用于创建可复用和可组合的函数、传递函数作为参数给泛型算法,以及保持状态处理需要上下文或历史记录的函数。

C++ 匿名函数和函数对象的适用场景区分
在 C++ 中,匿名函数和函数对象都是用于定义函数的替代方法,但它们的适用场景不同。
匿名函数
立即学习“C++免费学习笔记(深入)”;
简约夏季促销宣传合集矢量模板适用于夏季促销活动的宣传海报、社交媒体广告、电子邮件营销模板、网站横幅、产品目录、促销传单、店内展示牌、夏季主题的名片和邀请函、季节性包装设计、户外广告牌、品牌夏季推广的印刷物料以及数字广告相关等相关视觉场景设计的AI格式素材。
- 定义了一种一次性的、局部作用域的函数。
- 通常用于将函数指针或 lambda 表达式传递给函数或对象。
- 语法:
[capture-list](parameters) -> return-type { body }
实战案例:
// Sort a vector of integers using a lambda expression as a comparison function
auto compare = [](int a, int b) { return a > b; };
std::sort(v.begin(), v.end(), compare);函数对象
- 类或结构体的实例,该实例可以通过函数调用运算符重载为函数调用。
- 通常用于创建可复用和可组合的函数。
- 语法:
struct Foo {
void operator()(int x) {
// Do something with x
}
};实战案例:
// Define a function object to calculate the sum of two numbers
struct Summator {
int operator()(int a, int b) const {
return a + b;
}
};
// Use the function object in a function
int sum = std::accumulate(v.begin(), v.end(), 0, Summator());适用场景差异
- 一次性使用:如果要定义一个函数仅在特定上下文中使用一次,则使用匿名函数。
- 可重用性:如果需要创建可重用和可组合的函数,则使用函数对象。
-
泛型算法:当需要将函数作为参数传递给泛型算法(如
std::sort或std::accumulate)时,匿名函数更方便。 - 状态保持:函数对象可以维护状态,这在处理需要上下文或历史记录的函数时很有用。









