2

可能重复:
函数指针如何工作?

如何将函数作为参数传递?

您还可以将另一个类的函数作为参数传递(使用对象吗?)?

4

3 回答 3

3

除了函数指针,您还可以使用std::function 和 std::bindboost如果您没有 C++11,则可以使用等价物)。它们提供了多态函数包装器,所以你可以做一些事情,比如定义这个函数,它接受一个std::function接受两个 int 并返回一个 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)
}

这些都是易于使用的强大功能,不要被无用的示例误导。您可以包装普通函数、静态函数、成员函数、静态成员函数、仿函数......

于 2012-04-25T20:13:24.113 回答
2

有两种方法。

一是函数指针@dusktreader 概述。

另一种是使用函子或函数对象,您可以在其中定义一个使用operator()函数参数重载的类,然后传递该类的一个实例。

我总是发现后者更直观,但两者都可以。

于 2012-04-25T19:53:53.640 回答
0

您需要传递一个函数指针。语法并不难,这里有一个很棒的页面 它提供了如何在 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);
}
于 2012-04-25T19:42:15.457 回答