mem_fn和绑定的一些实际用途
some practical uses of mem_fn & bind
有人可以推荐tr1的mem_fn和绑定实用程序的一些很酷的实际用途吗?我不需要深奥的 c++ 来开发库。只是一些应用程序级别的编码,它使用这些。
任何帮助将不胜感激。
我已经将std::mem_fn
和std::bind
用于反射样式属性。
所以我会有一个向量为 AbstractProperty
的class SomeClass
.AbstractProperty
可以有几种不同类型的类,如PropertyFloat
类、类PropertyU32
类等。
然后在SomeClass
年,我将bind
std::function
AbstractProperty
.我会通过做来bind
std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)
对于二传手类型的函数,我会使用
std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1)
当然,将函数设置为类更困难,但我确实使用了一个std::function
来做到这一点。在PropertyFloat
我有
typedef std::function<float(void)> GetterType;
所以它通过一个函数设置它,我会传递我显示的第一个std::bind
作为参数
typename PropertyFloat::GetterType getter
当然,这些类型可以使用模板并且更通用,但这是一个权衡,具体取决于您正在开发的内容。
将成员函数用于回调可能会很麻烦,例如在<algorithm>
函数中使用。 std::mem_fn
(现在已经标准化了,所以你不再需要使用 tr1
命名空间)创建一个可调用的对象,该对象可用作这些函数的函子对象。有关其使用示例,请参阅此链接的示例部分,该部分使用 std::string::size
。
例如,当您在编译时不知道实际参数,但必须使用参数运行时创建可调用对象时,可以使用std::bind
。它还可用于对参数重新排序,例如:
auto f1 = std::bind(printf, _2, _1);
f1(42, "%dn");
(好吧,愚蠢的例子,但我现在能想到的只有。
以下代码计算大于 5 的元素数:
#include <functional>
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
using namespace std;
vector<int> v { 1, 5, 2, 7, 6, 7, 5 };
cout << count_if(v.begin(), v.end(),
bind(greater<int>(), placeholders::_1, 5)) << endl;
}
一个问题是 lambda 难以使用前向声明类的方法。我使用 bind 来利用使用前向声明类中的方法的成员函数。我找不到使用 lambda 的解决方案。场景是这样的:我有一个成员函数的列表,f1,f2,...在类 A 中定义,其中一些使用前向声明类中的方法。我希望能够灵活地将表达式树(类 B 的节点)的运算符替换为这些 fi 函数中的任何一个。在 B 中,定义了一个泛型运算符。我使用 bind 自适应地将 fi 函数关联到泛型运算符。这样,fi 成员函数定义可以在放置前向声明的 A.h 文件中进行原型设计,然后将 fi 函数的实现放在 A.cpp 文件中并由 B 类访问。 我很好奇其他人是否遇到过这个问题以及他们如何处理它。
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- 有没有办法将重载的类函数绑定到函数对象?
- 替换 C++17 中移除的绑定 1st