这是一个语法问题。
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
文档说comp
可以是函数指针或对象。
但是如果传递函数指针,C ++的哪种机制允许使用函数指针代替对象,即Compare comp
?
为什么不是编译错误?
答案 0 :(得分:2)
给定一个带有函数调用操作符的对象
struct Functor {
bool operator()(const Foo& a, const Foo& b) {
return a < b;
}
};
很容易看到sort
函数可以实例化,以便Compare comp
参数接受Functor
对象。
sort(/* other params we don't care about here */, Functor comp);
足够公平。
你的问题是 - 这怎么能接受一个函数指针?让我们先来看一下函数指针的类型是什么?
考虑以下
bool compare(const Foo& a, const Foo& b);
bool (*func_ptr)(const Foo&, const Foo&) = compare;
指向函数compare
的指针类型,如上面第二行所示,是bool (*)(const Foo&, const Foo&)
。你可以像任何其他类型一样输入dede:
typedef bool (*func_ptr_type)(const Foo&, const Foo&);
func_ptr_type ptr = compare;
或等效地:
using func_ptr_type = bool(*)(const Foo&, const Foo&);
func_ptr_type ptr = compare;
现在,当你提供一个指向std::sort
的函数指针时,显然类型Compare
成为指针类型,类似于上面的func_ptr_type
,并且参数看起来很多与第二行中的示例相同:
sort(/* other params we don't care about here */, func_ptr_type comp);
这一切都有效,因为sort
函数实际上是一个函数模板。它根据其用途使用不同类型进行实例化。当它用对象实例化时,它的参数按值接受该对象(Compare
类型被推断为对象的类型)。当使用函数指针实例化时,Compare
类型被推断为函数指针类型。