回答
通常,使用成员函数进行回调可能相当麻烦,例如在<algorithm>
函数中使用。 std::mem_fn
(它现在已经标准化,因此不需要再使用tr1
命名空间)创建一个可调用的对象,该对象可用作这些函数的函子对象。有关其使用的示例,请参阅使用std::string::size
的this link的示例部分。
std::bind
可以在例如,你不知道编译时的实际参数,但必须创建一个带有参数运行时的可调用对象。它也可以用来重新排序参数,例如:
auto f1 = std::bind(printf, _2, _1);
f1(42, "%d\n");
(好吧,愚蠢的例子,但现在已经好了,我能想到的。)
我已经使用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)
对于二传手类型的功能,我会用
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
当然,类型可以利用模板和可更通用,但这是一种权衡取决于你正在开发的东西。
下面的代码计数元件大于五的数目:
#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函数更好的选择? – 2016-01-07 13:34:29
- 1. jQuery.get() - 实际用途?
- 2. Lua在Mac OS X中的一些实际用途是什么?
- 3. 线程的实际用途
- 4. 什么是System.Transactions的实际用途?
- 5. jQuery的实际用途是什么?
- 6. Seralization隔离级别的实际用途?
- 7. toContain()的实际用途是什么?
- 8. 对象序列化的实际用途?
- 9. 的mem_fn到的mem_fn构件
- 10. 如果我们有boost :: bind,使用boost :: mem_fn有什么意义?
- 11. 你对jQuery的data()方法应用了哪些更实际的用途?
- 12. JUnit测试用例中“失败”的实际用途是什么?
- 13. ES5提供的新方法的实际用途是什么?
- 14. 什么是PHP的睡眠()的实际用途?
- 15. NSSearchPathDirectory的一些用途枚举
- 16. resx文件的实际用途是什么?
- 17. 受保护构造函数的实际用途是什么?
- 18. 双向覆盖“bdo”的实际用途是什么?
- 19. 什么是stream_wrapper_register在php中的实际用途?
- 20. .PDB文件的实际用途是什么?
- 21. android中.so文件的实际用途是什么?
- 22. String的toString()方法有实际用途吗?
- 23. SQLite3的反向二进制排序有什么实际用途?
- 24. 可挂载式发动机的实际用途是什么?
- 25. 通过引用复制对象是否有实际用途?
- 26. 异或算法在算法中的一些实际应用
- 27. ROT13算法的一些实际应用是什么?
- 28. 是否有一些实际的例子使用Object :: *
- 29. Async Web API是否适合任何实际用途?
- 30. SSAS的实际实施(一步一步)
1。这也是我想尝试的一种。你有更多的细节来分享你如何做反射位? – Fanatic23 2012-04-14 21:02:07
嗯,这基本上是我可以描述的最多,没有可能将整个代码库放在github上或什么东西(代码是封闭的源代码)。我更新了我的帖子,以提供更多细节。不幸的是,我在这里开发的系统类型没有很多文档。我正在编写整个系统的大文档,但尚未完成。我可以说我已经使用了'std :: mem_fn'和'std :: bind'这种东西近两年了,但没有任何问题。 – josephthomas 2012-04-14 21:07:40
也不是,这是我知道的'mem_fn'和'bind'最复杂的用法之一。如果你正在寻找使用这两种类型的练习,也许你应该看看它们的一些小用法(我在开发这个系统之前首先做了)。这个反射系统是围绕这两种类型(和'std :: function')的使用而构建的。虽然老实说,这可能只能用成员函数指针来替换(理论上)。他们都有其优点和缺点。 – josephthomas 2012-04-14 21:16:17