将函数指针的“部分”作为参数传递

时间:2012-05-28 19:25:39

标签: c++ function pointers lambda function-pointers

我确信之前已经问过,但是很难找到... 所以,我得到的是一个接受函数指针的函数。这个函数指针有3个参数。所以,我想传递给另一个函数,相同的指针,但填充了2个参数。

所以,像这样:

int func1 (int (*funcptr)(int, int, int)) {
  return func2(funcptr(,8,9));
}

int func2 (int (*funcptr)(int)) {
  return (*funcptr)(2);
}

编辑:  好的,所以我现在使用lambda

得到了这个
int func2(int (*funcptr2)(int)) {
  return (*funcptr2)(2);
}
int func1(int (*funcptr1)(int, int, int)) {
  return func2(
    [funcptr1](int i)->int {
      return (*funcptr1)(i,8,9);
    }
  );
}

但是它给了我

“无法将参数1的func1(int (*)(int, int, int))::<lambda(int)>转换为int (*)(int)int func2(int (*)(int))

3 个答案:

答案 0 :(得分:2)

这称为lambda,您可以使用newer C++ versions,std :: bind,boost :: bind或boost::function来完成。

答案 1 :(得分:1)

在C中,你不能。您必须传递函数指针和两个参数。

在C ++中,您可以使用std::bind(或旧版本中的boost::bind)来实现此目的。

答案 2 :(得分:1)

要回答您更新的问题,捕获变量的lambda(正如您的lambda与funcptr1一样)无法转换为函数指针。直觉上这是有道理的,因为你的lambda必须每个lambda存储这个捕获的变量;而使用函数指针无法做到这一点。

最好的解决方案可能是采用std::function类型的参数,它是任何可调用类型的包装器:

int func2(std::function<int(int)> funcptr2) {
  return funcptr2(2);
}
int func1(std::function<int(int,int,int)> funcptr1) {
  return func2(
    [funcptr1](int i)->int {
      return funcptr1(i,8,9);
    }
  );
}

您还可以使用模板使您的函数适用于任何可调用类型:

template <typename F>
int func2(F funcptr2) {
  return funcptr2(2);
}
template <typename F>
int func1(F funcptr1) {
  return func2(
    [funcptr1](int i)->int {
      return funcptr1(i,8,9);
    }
  );
}