我在 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/