我有这段代码:
#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)
函数?
答案 0 :(得分: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)
答案 1 :(得分:0)
如何使用
void()
仿函数调用void(int)
函数?
std::bind(fun)
不返回void()
函数,它返回一个未指定类型的调用包装器。
调用该调用包装器的常用方法是使用零参数,但在bind()
的大多数实现中,可以使用零个或多个参数调用该类型,并且其他参数将是忽略(即未传递给目标函数)
更一般地说,对于采用F
参数的函数N
,bind(F)
返回一个可以使用N
或更多参数调用的调用包装器。如果绑定参数或使用占位符,那么它将改变调用调用包装器所需的最小参数数。