std::function and std::bind behavior
std::function and std::bind behavior
我有这样的代码:
#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
或更多参数调用的调用包装器。如果您绑定参数或使用占位符,那么它将改变调用调用包装器所需的最小参数数量。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- Strange behavior of std::vector<{QString,int*}>
- std::unordered_map::begin(int n) behavior
- 如何使用 get std::bind like behavior
- std::vector and std::min behavior
- std::function and std::bind behavior