mem_fn&的一些实际用途捆绑

时间:2012-04-14 20:36:27

标签: c++ stdbind tr1 mem-fun

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

任何帮助都将非常感激。

4 个答案:

答案 0 :(得分:6)

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

所以我的class SomeClass的向量为AbstractPropertyAbstractProperty可以有几种不同类型的类,例如PropertyFloatPropertyU32等。

然后在SomeClassbind std::function AbstractProperty。我会bind

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

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

 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

当然,类型可以使用模板并且更通用,但这取决于您正在开发的内容。

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:3)

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

#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;
}

答案 3 :(得分:0)

一个问题是 lambda 很难使用来自前向声明类的方法。我已经使用 bind 来利用使用前向声明类中的方法的成员函数。我找不到使用 lambda 的解决方案。这是一个场景:我有一个成员函数列表,f1,f2,...在类 A 中定义,其中一些使用了来自前向声明类的方法。我希望能够使用这些 fi 函数中的任何一个灵活地交换表达式树(B 类)节点的运算符。在 B 中,定义了泛型运算符。我使用 bind 将 fi 函数自适应地关联到泛型运算符。这样,fi 成员函数定义可以在放置前向声明的 A.h 文件中建立原型,然后 fi 函数的实现可以放在 A.cpp 文件中并由 B 类访问。我很好奇其他人是否遇到过这个问题以及他们是如何处理的。