callable object 和function object有什么区别?

在C++中,”callable object”和”function object”(通常称为functor)都是可被调用的实体,但它们涵盖的范围和具体含义有所不同。

Callable Object

“Callable object”是一个广义的术语,指的是任何可以通过调用表达式被调用的实体。在C++中,callable objects包括:

  1. 函数指针:指向函数的指针。
  2. 函数对象(Functors):重载了函数调用操作符operator()的类的实例。
  3. Lambda表达式:匿名函数,它可以捕获作用域中的变量。
  4. 成员函数指针:指向类成员函数的指针,使用时需要和一个对象实例或指针结合使用。
  5. 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的概念更广,包括所有可以被调用的实体。

发表回复 0

Your email address will not be published. Required fields are marked *