答案 0 :(得分:3)
除了函数指针之外,如果你没有C ++ 11,你可以使用std::function and std::bind(或boost
等价物。这些提供了polimorphic函数包装器,所以你可以做一些像定义这个函数的东西,它需要一个带有两个整数的std::function
并返回一个double:
double foo(std::function<double(int, int)> f) {
return 100*f(5,89);
}
然后您可以传递与该签名匹配的任何内容,例如:
struct Adder {
double bar(double a, double b) { return a+b;}
};
int main() {
using namespace std::placeholders;
Adder addObj;
auto fun = std::bind(&AdderC::bar, &addObj, _1, _2); // auto is std::function<double(int,int)>
std::cout << foo(fun) << "\n"; // gets 100*addObj.bar(5,89)
}
这些都是易于使用的强大功能,不要被无用的例子误导。您可以包含普通函数,静态函数,成员函数,静态成员函数,函子......
答案 1 :(得分:2)
有两种方式。
一个是函数指针@dusktreader概述。
另一种方法是使用functors或函数对象,您可以使用函数的参数定义一个重载operator()
的类,然后传递该类的实例。
我总是发现后者更直观,但要么会这样做。
答案 2 :(得分:0)
您需要传递一个函数指针。语法并不太难,并且有一个很棒的页面here,它提供了如何在c和c ++中使用函数指针的详细分析。
从该页面(http://www.newty.de/fpt/fpt.html):
//------------------------------------------------------------------------------------
// 2.6 How to Pass a Function Pointer
// <pt2Func> is a pointer to a function which returns an int and takes a float and two char
void PassPtr(int (*pt2Func)(float, char, char))
{
int result = (*pt2Func)(12, 'a', 'b'); // call using function pointer
cout << result << endl;
}
// execute example code - 'DoIt' is a suitable function like defined above in 2.1-4
void Pass_A_Function_Pointer()
{
cout << endl << "Executing 'Pass_A_Function_Pointer'" << endl;
PassPtr(&DoIt);
}