2012-04-14 35 views
6

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

任何帮助将不胜感激。

回答

5

通常,使用成员函数进行回调可能相当麻烦,例如在<algorithm>函数中使用。 std::mem_fn(它现在已经标准化,因此不需要再使用tr1命名空间)创建一个可调用的对象,该对象可用作这些函数的函子对象。有关其使用的示例,请参阅使用std::string::sizethis link的示例部分。

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

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

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

5

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

所以我会有一个class SomeClass矢量AbstractProperty。可以有几种不同类型的类从AbstractProperty,如PropertyFloatPropertyU32

然后在SomeClass我将bindstd::functionAbstractProperty。我会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 

当然,类型可以利用模板和可更通用,但这是一种权衡取决于你正在开发的东西。

+0

1。这也是我想尝试的一种。你有更多的细节来分享你如何做反射位? – Fanatic23 2012-04-14 21:02:07

+0

嗯,这基本上是我可以描述的最多,没有可能将整个代码库放在github上或什么东西(代码是封闭的源代码)。我更新了我的帖子,以提供更多细节。不幸的是,我在这里开发的系统类型没有很多文档。我正在编写整个系统的大文档,但尚未完成。我可以说我已经使用了'std :: mem_fn'和'std :: bind'这种东西近两年了,但没有任何问题。 – josephthomas 2012-04-14 21:07:40

+0

也不是,这是我知道的'mem_fn'和'bind'最复杂的用法之一。如果你正在寻找使用这两种类型的练习,也许你应该看看它们的一些小用法(我在开发这个系统之前首先做了)。这个反射系统是围绕这两种类型(和'std :: function')的使用而构建的。虽然老实说,这可能只能用成员函数指针来替换(理论上)。他们都有其优点和缺点。 – josephthomas 2012-04-14 21:16:17

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; 
} 
+0

为什么在这个例子中绑定是比lambda函数更好的选择? – 2016-01-07 13:34:29

相关问题