std::function and std::bind behavior

std::function and std::bind behavior

本文关键字:std behavior bind function and      更新时间:2023-10-16

我有这样的代码:

#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);
}

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

如何使用void(int)函子调用void()函数?

作为模板参数传递给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)

如何使用void(int)函子调用void()函数?

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

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

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