4

不久前,我遇到了一个问题,即如何将 bind 返回的可调用对象(称为 A)传递给另一个函数(称为 B),该函数需要一个参数,该参数是指向来自 A 的函数的指针。我发现bind 返回的可调用 A 具有非常复杂的类型,因此放弃了我的方法。

然后我在功能标题中了解了“功能”,这听起来好像可以解决我的问题。然而,经过几次尝试,我又被挫败了!也许你能帮忙?这是一些不起作用的代码:

#include <iostream>
#include <functional>  //Library for "bind" and "function"                                                                                                                                     
#include <cmath>
using namespace std;
using namespace std::placeholders;  //for _1, _2, _3 ...                                                                                                                                       

//praboloid function                                                                                                                                                                           
int parab(int x, int y)  {
  return pow(x,2) + pow(y,2);
}

//Take an integer and a pointer to a function                                                                                                                                                  
int funk(int a, int (*f)(int) )  {
  return (*f)(a);
}

int main()  {
  auto f = bind(parab, _1, 0); // Bind the second value to 0                                                                                                                                  
  function<int (int)> fp = f;

  //Any of the following lines creates and error                                                                                                                                               

  function<int (*)(int)> fp = f; //Error!                                                                                                                                                      
  funk(-5, f);  //Error!                                                                                                                                                                       
  funk(-5, &f); //Error!                                                                                                                                                                       
  funk(-5, fp); //Error!
  funk(-5 &fp); //Error!                                                                                                                                                                   

  return 0;
}

我要做的就是首先使用 bind 创建一个新的可调用对象,然后将该绑定函数作为参数发送到另一个函数。如果可能的话,我不想处理 bind 返回的杂乱类型。

我对解决这个问题的替代方法持开放态度。

4

3 回答 3

4

尝试auto f = [](int n) -> int { return parab(n, 0); };

这应该适用funk(-5, f)(因为非捕获闭包可转换为函数指针)。

bindfunction拥有自己的位置,但它们并不总是最佳选择。

于 2013-07-03T22:26:03.027 回答
2

astd::function取 anint并返回 an的类型intis std::function<int(int)>not std::function<int(*)(int)>

其次,astd::function不能转换为函数指针。如果您想将funks传递给它,请将您的接口更改为,或使其成为未知类型的参数。int funk(int a, std::function<int(int)>)std::functiontemplate

第三,如果您使用无状态 lambda,则可以将其传递给采用函数指针的函数。无状态 lambda 是不捕获任何内容的 lambda 类型——[]方括号中没有任何内容。在这种情况下,您的绑定表达式可以重写为无状态 lambda,因为您的绑定是编译时已知值。

于 2013-07-03T22:45:22.163 回答
2

f不是int (*f)(int)。它是未指定类型的函子。但它可以用作函数。所以只要把任何 tpe 放进去funk

template<typename F>
int funk(int a, F f)  {
  return f(a);
}
于 2013-07-03T22:51:30.770 回答