1

我确定以前有人问过这个问题,但是很难搜索...所以,我得到的是一个接受函数指针的函数。这个函数指针有 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))

4

3 回答 3

2

这称为 lambda,您可以使用较新的 C++ 版本、std::bind、boost::bind 或boost::function 来实现。

于 2012-05-28T19:27:57.370 回答
1

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

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

于 2012-05-28T19:27:24.757 回答
1

要回答您更新的问题,捕获变量的 lambda(就像您的 lambda 对 lambda 所做的那样funcptr1)不能转换为函数指针。直观地说,这是有道理的,因为您的 lambda 必须为每个 lambda 存储这个捕获的变量;而没有办法用函数指针来做到这一点。

最好的解决方案可能是采用 type 的参数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);
    }
  );
}
于 2012-05-29T18:37:26.537 回答