有人可以推荐tr1的mem_fn和绑定工具的一些很酷的实际用途吗?我不需要深奥的c ++用于库开发。只是一些使用这些的应用程序级编码。
任何帮助都将非常感激。
答案 0 :(得分:6)
我已将std::mem_fn
和std::bind
用于反射样式属性。
所以我的class SomeClass
的向量为AbstractProperty
。 AbstractProperty
可以有几种不同类型的类,例如PropertyFloat
,PropertyU32
等。
然后在SomeClass
我bind
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}}的示例部分。
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 类访问。我很好奇其他人是否遇到过这个问题以及他们是如何处理的。