mem_fn和绑定的一些实际用途

some practical uses of mem_fn & bind

本文关键字:fn 绑定 mem      更新时间:2023-10-16

有人可以推荐tr1的mem_fn和绑定实用程序的一些很酷的实际用途吗?我不需要深奥的 c++ 来开发库。只是一些应用程序级别的编码,它使用这些。

任何帮助将不胜感激。

我已经将std::mem_fnstd::bind用于反射样式属性。

所以我会有一个向量为 AbstractPropertyclass 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 类访问。 我很好奇其他人是否遇到过这个问题以及他们如何处理它。