绑定函数如何对 C++ 中的函数对象工作
how bind function works for functional objects in c++
我遇到了以下find_if函数。
find_if (coll.begin(), coll.end(),
bind(logical_and<bool>(),
bind(greater<int>(),_1,x), bind(less<int>(),_1,y)
)
);
我怀疑绑定(更大(),_1,x)和绑定(less(),_1,y)是如何计算并在那里返回布尔值的?否则这将不起作用,如下所示。
#include <iostream>
#include <functional>
int main()
{
using namespace std::placeholders;
//auto fn = std::bind(std::greater<int>(), 5, _1);
//std::cout << fn(7) << std::endl;
//std::cout << typeid(fn).name() << std::endl;
auto fn1 = std::bind(std::greater<int>(),5,6);
auto fn2 = std::bind(std::less<int>(),7,5);
std::cout << std::bind( std::logical_and<bool>(), fn1, fn2 )(); // how this works??
std::cout << std::logical_and<bool>()(fn1, fn2)(); // Compilation error
}
真的很想知道函子是如何在绑定函数中调用的。有人可以解释一下这是如何工作的吗?提前谢谢。
要理解这一点,我们需要 1st 了解 bind
如何绑定它的参数。鉴于g
是bind
表达式的结果,该表达式调用如下: g(u1, u2, ... uM)
:
- 如果存储的参数 arg 是
std::reference_wrapper<T>
类型(例如,在初始调用 bind 中使用了std::ref
或std::cref
),则arg.get()
上述std::invoke
调用中的参数vn
,同一调用中的Vn
类型T&
:存储的参数通过引用传递到调用的函数对象中。- 如果存储的参数 arg 属于
std::is_bind_expression<T>::value == true
的T
类型(这意味着,另一个绑定表达式直接传递到对绑定的初始调用中),则 bind 执行函数组合:不是传递绑定子表达式将返回的函数对象,而是急切地调用子表达式,并将其返回值传递给外部可调用对象。如果绑定子表达式有任何占位符参数,则它们与外部绑定共享(从u1
、u2
、...中选取)。具体来说,上面std::invoke
调用中vn
的参数是arg(std::forward<Uj>(uj)...)
的,同一调用中的Vn
类型是std::result_of_t<T cv &(Uj&&...)>&&
的(cv 限定条件与g
的相同)。- 如果存储的参数 arg 是类型
T
,则std::is_placeholder<T>::value != 0
,这意味着占位符,例如std::placeholders::_1
、_2
、_3
、...用作初始调用 bind 的参数),然后将占位符指示的参数(u1
表示_1
,u2
表示_2
等)传递给可调用对象:上面std::invoke
调用中vn
的参数是std::forward<Uj>(uj)
,同一调用中的相应类型Vn
是Uj&&
。- 否则,普通存储的参数 arg 将作为 lvalue 参数传递给可调用对象:上面
std::invoke
调用中vn
的参数只是 arg,对应的类型Vn
是T cv &
,其中cv
与g
的 cv 限定符相同。
关键在第二个项目符号中。由于绑定表达式是在绑定时调用的,因此可以正常工作:
std::cout << std::bind(std::logical_and<bool>(), fn1, fn2)()
但由于没有为绑定表达式定义&
运算符,因此这不起作用:
std::cout << std::logical_and<bool>()(fn1, fn2)()
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 有没有办法将重载的类函数绑定到函数对象?
- 将指针传递到成员的指针,从模板参数包到函数对象
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 如何通过接口将函子分配给函数对象
- 对std::函数对象的调用不匹配,该对象是指向成员函数的指针
- 指向std::invoke中成员函数对象的指针
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- "std::function"的简单版本:函数对象的生存期?
- C++ 将函数对象作为左值和/或右值传递
- SFINAE 用于具有默认参数的函数对象
- 构造函数对象赋值是否泄漏内存
- 如何发送通过绑定到函数/方法创建的函数对象?
- std::for_each 与函数对象
- 将函数对象传递给 std::function
- 访问执行策略for_each函数对象中的迭代器
- 通过C++函数对象类访问参数