c++ - 有助于理解函数对象的工作原理?

标签 c++ functor function-object

我在 Wikipedia 上找到了这段代码

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);
}

起初我想知道 A 和 B 参数是如何传递给 operator()(int A, int B) 的,因为在 sort_ints 中甚至没有任何括号就提到了仿函数。

然后我发现 A 和 B 被传递给 sort_ints 函数内的函数对象。但是,sort_ints 的声明不应该有“ComparisonFunctor*** c”而不是“ComparisonFunctor c”,因为它正在接收一个函数的地址吗?

在 sort_ints 函数内部,对仿函数的函数调用会像这样完成吗?

functor(*begin_items, *(begin_items+1));

最佳答案

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

compare_class myComparator;
myComparator(a, b);

翻译成

compare_class myComparator;
myComparator.operator() (a, b);

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

关于c++ - 有助于理解函数对象的工作原理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4847929/

相关文章:

haskell - Haskell 中部分应用函数类型 (a ->) 作为 Functor 实例

c++ - 在下面的示例中,函数对象 "rev"是根据自身定义的。这怎么可能?

c++ - 什么时候在 C++ 中使用函数对象?

c++ - 为什么 N3421 不提供 noexcept 限定词?

c++ - Boost.thread 代码在 Ubuntu 和 Windows 中呈现不同的行为

c++ - C++14 中 3.7.4.2[basic.stc.dynamic.deallocation]/2 中的脚注 37 的原因是什么?

c# - 复制 C++ dll 以构建通过扩展引用它们的任何 C# 项目的输出

c++ - 如何在Project CMake中正确包含SDL2源代码

c++ - 调用这个函数对象是如何工作的?

lambda - 如何返回依赖于模板参数的函数类型?