5

我有这个代码:

#include <iostream>
#include <functional>
#include <vector>

void fun()
{
    std::cout<<"fun";
}

void gun(int)
{
    std::cout<<"gun";
}

int main()
{
    std::vector<std::function<void(int)>> vec;

    vec.push_back(std::bind(fun));
    vec.push_back(gun);

    vec[0](1);
    vec[1](2);
}

你能解释一下绑定函数时如何std::bind返回吗?std::function<void(int)>void()

如何void()使用仿函数调用函数void(int)

4

2 回答 2

9

作为模板参数传递的签名function仅确定将绑定多少个占位符 ( _1) 以及类型。

实际函数的调用仅使用绑定函数实际需要的参数数量。实际上,多余的参数被忽略了。

另一个更有启发性(?)的例子,从另一面来看:

#include <iostream>
#include <functional>

void gun(int i)
{
    std::cout<<"gun("<<i<<")";
}

int main()
{
    using namespace std::placeholders;
    std::bind(gun, _5)("ignore", 3, "and", 4, 43);
}

印刷

gun(43)
于 2013-04-23T06:47:03.327 回答
0

如何void()使用仿函数调用函数void(int)

std::bind(fun)不返回void()函数,它返回未指定类型的调用包装器。

调用该调用包装器的常用方法是使用零个参数,但在大多数bind()该类型的实现中,可以使用零个或多个参数调用,并且其他参数将被忽略(即不传递给目标函数)

更一般地,对于F接受N参数的函数,bind(F)返回一个可以使用N或更多参数调用的调用包装器。如果您绑定参数或使用占位符,那么它将改变调用调用包装器所需的最小参数数量。

于 2013-04-23T14:54:13.883 回答