0

下面的代码无法编译。该函数foo将函数指针f作为参数,f严格将一个 int 作为参数并返回一个 int。在此示例中,foo始终f使用参数调用3。我想传递一个函数,foo以便在f(3)评估时与其他参数一起评估它;但是,我不能将带有 2 个整数的函数作为参数传递给foo(这个问题是一个真实问题的类比)。

#include <iostream>

void foo(int(*f)(int))
{
  std::cout << f(3) << std::endl;
}

struct plusX
{
  plusX(int x_) : x(x_) {}
  int x;
  int plus(int y)
  {
    return x + y;
  }
};

int main()
{
  plusX px4(4);
  foo(&px4.plus);  // ERROR!
}

ISO C++ 禁止使用绑定成员函数的地址来形成指向成员函数的指针。说'&plusX::plus'

4

1 回答 1

0

两种解决方案。如果现有代码使用函数,第一个解决方案不需要重构代码。

1)使用函子:

#include <iostream>

template<typename F>
void foo(F&& f)
{
  std::cout << f(3) << std::endl;
}

struct my_functor
{
  my_functor(int x_) : x(x_) {}
  int operator()(int y)
  {
    return x + y;
  }
  int x;
};

int main()
{
  my_functor f(4);
  foo(f);
}

2) 使用 std::function 和 std::bind

#include <iostream>
#include <functional>

void foo(const std::function<int(int)>& f)
{
  std::cout << f(3) << std::endl;
}

int add(int x, int y)
{
  return x + y;
}

int main()
{
  std::function<int(int)> f_binded = std::bind(add, 4, std::placeholders::_1);
  foo(f_binded);
}
于 2015-10-28T04:29:26.857 回答