10

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

任何帮助将不胜感激。

4

4 回答 4

7

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

所以我会有一个class SomeClass带有AbstractProperty. 可以有几种不同类型的类AbstractProperty,例如PropertyFloat,PropertyU32等。

然后在SomeClass我会bind来一个std::functionfor AbstractProperty。我bind会这样做

std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)

对于 setter 类型函数,我会使用

 std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1)

当然,给类设置函数比较困难,但我确实使用 astd::function来做到这一点。在PropertyFloat我有

typedef std::function<float(void)> GetterType;

所以它通过一个函数设置它,我会传递std::bind我显示的第一个作为参数

typename PropertyFloat::GetterType getter

当然,这些类型可以使用模板并且更通用,但这取决于您的开发目标。

于 2012-04-14T20:53:55.177 回答
5

通常,将成员函数用于回调可能会很麻烦,例如在<algorithm>函数中使用。std::mem_fn(它现在已经标准化,因此您不再需要使用tr1命名空间)创建一个可调用对象,该对象可以用作这些函数的仿函数对象。有关其使用示例,请参阅此链接的示例部分,该部分使用std::string::size.

std::bind可以在例如您在编译时不知道实际参数但必须创建带有参数运行时的可调用对象时使用。它还可以用于重新排序参数,例如:

auto f1 = std::bind(printf, _2, _1);
f1(42, "%d\n");

(好吧,愚蠢的例子,但我现在能想到的。)

于 2012-04-14T20:50:30.577 回答
4

以下代码计算大于五的元素数:

#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;
}
于 2012-04-14T20:53:58.057 回答
0

一个问题是 lambda 很难使用前向声明的类中的方法。我使用 bind 来使用使用前向声明类中的方法的成员函数。我找不到使用 lambdas 的解决方案。场景如下:我有一个在类 A 中定义的成员函数 f1、f2、... 的列表,其中一些使用了前向声明类中的方法。我希望能够使用这些 fi 函数中的任何一个灵活地交换表达式树 B 类节点的运算符。在 B 中,定义了一个通用运算符。我使用 bind 将 fi 函数自适应地关联到通用运算符。这样,fi 成员函数定义可以在放置前向声明的 Ah 文件中进行原型化,然后 fi 函数的实现可以放在 A.cpp 文件中并由 B 类访问。我'

于 2021-01-09T07:27:44.990 回答