callable object 和function object有什么区别?
在C++中,”callable object”和”function object”(通常称为functor)都是可被调用的实体,但它们涵盖的范围和具体含义有所不同。
Callable Object
“Callable object”是一个广义的术语,指的是任何可以通过调用表达式被调用的实体。在C++中,callable objects包括:
- 函数指针:指向函数的指针。
- 函数对象(Functors):重载了函数调用操作符
operator()
的类的实例。 - Lambda表达式:匿名函数,它可以捕获作用域中的变量。
- 成员函数指针:指向类成员函数的指针,使用时需要和一个对象实例或指针结合使用。
- std::function:能够存储、复制和调用任何Callable object,是一个通用的函数包装器。
Function Object (Functor)
“Function object”,或称为”functor”,是指一个具体的类,这个类重载了函数调用操作符operator()
。这使得该类的实例可以像函数那样被调用。Functors可以保存状态(即成员变量)和具有类型信息,这使它们比简单的函数指针更加灵活。
举例说明
Function Object 示例
#include <iostream>
class Adder {
public:
Adder(int y) : y_(y) {}
int operator()(int x) const {
return x + y_;
}
private:
int y_;
};
int main() {
Adder add_five(5);
std::cout << add_five(10) << std::endl; // 输出: 15
return 0;
}
这个例子中,Adder
是一个function object,因为它是一个类,这个类重载了operator()
。
Callable Object 示例
使用lambda表达式作为另一个callable object的例子:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums {1, 2, 3, 4, 5};
int factor = 2;
std::for_each(nums.begin(), nums.end(), [factor](int &n) { n *= factor; });
for (int n : nums) {
std::cout << n << " "; // 输出: 2 4 6 8 10
}
return 0;
}
在这个例子中,lambda表达式[factor](int &n) { n *= factor; }
是一个callable object,它被传递到std::for_each
中并对nums
中的每个元素应用。
总的来说,function object是callable object的一种,但callable object的概念更广,包括所有可以被调用的实体。