我不明白为什么以下代码编译和运行:
template<typename Predicate>
void foo(Predicate p) {
}
bool g(int n) {
}
void user(int n) {
foo(g);
}
foo
应该得到一个将在数据结构上运行的函数对象,但我使方法更简单,因为我不明白这是如何工作的?方法不是一个对象。正常的方法是创建一个新类,覆盖operator()
,然后发送该类的实例。
答案 0 :(得分:4)
嗯,在这种情况下,Predicate参数被类型为bool (*func) (int)
的函数指针替换。这没什么不对......
答案 1 :(得分:3)
Predicate
模板参数几乎可以是任何类型。因此,您可以将它用于函数指针和类以及基本类型。
如果使用函数参数p
作为函数,则它可以是任何可调用的函数,如函数指针,其类具有operator()
成员函数的对象,指向a的指针静态成员函数,std::bind
对象,std::function
对象或lambda expression。
它不能成为指向成员函数的指针,因为要调用指向成员函数的指针,您需要一个实例来调用它。对于此用途std::bind
。