使用std :: function和std :: bind C ++将带参数的void方法传递给另一个方法

时间:2017-12-09 20:04:51

标签: c++ c++11

class A
{
public:
    A() {}

    void print(std::function<void(int)> func);

    virtual ~A() {}
};

void A::print(std::function<void(int)> func)
{
    func();
}

void printInt(int a)
{
    std::cout << a << std::endl;
}

int main()
{
    A a;

    a.print(std::bind(&printInt, 3));

    return 0;
}

我们说我有这个代码示例。如何将void方法printInt(int a)传递给A :: print(std :: function func)并调用已传递的函数?我得到&#34;候选人期望1个参数,0提供&#34;我不知道如何处理。

编辑: 我应该提到它,但我的目标是传递整数,但实际上我不知道如何。当我尝试这样的事情时:

void A::print(std::function<void(int a)> func)
{
 func(a);
}

我得到&#34;错误:'a'未在此范围内宣布&#34;。

2 个答案:

答案 0 :(得分:4)

如果您不打算将任何参数传递给func,则应为std::function<void(void)>void(int)的签名意味着您打算为其提供一个整数,它将期望。而且你的代码显然没有提供必要的论证。

如果您打算将参数传递给func,则它必须是A::print的参数,如下所示:

void A::print(std::function<void(int)> func, int a) {
  func(a);
}

您的尝试指定函数参数名为a,这是没有实际意义的。由于a中没有A::print可供参考。以上也意味着您可以免除bind

a.print(&printInt, 3);

答案 1 :(得分:0)

你的bind()创建一个不带参数的函数,但是A :: print需要一个取1的函数。然后尝试调用该函数,就好像它不带参数一样。

答案是将A :: print改为采用不带参数的std ::函数。