帮助理解函数对象的工作?

Nav*_*Nav 2 c++ functor function-object

我在维基百科上找到了这段代码

class compare_class {
  public:
  bool operator()(int A, int B) const {
    return A < B;
  }
};
...
// Declaration of C++ sorting function.
template <class ComparisonFunctor> 
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);
...
int main() {
    int items[] = {4, 3, 1, 2};
    compare_class functor;
    sort_ints(items, sizeof(items)/sizeof(items[0]), functor);
}
Run Code Online (Sandbox Code Playgroud)

起初我想知道如果在sort_ints中提到了仿函数而没有任何括号,那么A和B参数如何传递给operator()(int A,int B).

然后我想到A和B被传递给sort_ints函数内的函数对象.但那么,sort_ints的声明是否应该使用'ComparisonFunctor***c'而不是'ComparisonFunctor c',因为它接收函数的地址?

在sort_ints函数内部,函数调用函数是否会完成这样的操作?

functor(*begin_items, *(begin_items+1));
Run Code Online (Sandbox Code Playgroud)

tem*_*def 6

要理解为什么要按sort_ints值获取其参数,您必须记住,作为比较器传递给它的对象不一定是函数指针.例如,如果您正在使用compare_class函数对象进行比较,那么您传递给函数的是类型的具体对象compare_class.你没有传递地址compare_class::operator(),因为它operator()是一个成员函数,而不是一个自由函数.也就是说,以下代码:

compare_class myComparator;
myComparator(a, b);
Run Code Online (Sandbox Code Playgroud)

翻译成

compare_class myComparator;
myComparator.operator() (a, b);
Run Code Online (Sandbox Code Playgroud)

因此,参数需要通过值而不是指针来接收比较器,因为它需要接收器对象,而不是指向成员函数的指针或指向接收器对象的指针.