我主要是一个从事C ++项目的.NET程序员,我正在尝试确定处理使用Action和Function模板类型的委托的等效方法。我在.NET代码中使用委托作为事件和回调。我的C ++项目使用智能指针和与C#程序相同的委托设计模式。处理这种情况的最佳方法是什么?我不清楚如何传递和维护一个函数指针,该函数指针也跟踪智能指针并可能删除底层对象,因为事件容器使用弱引用。该库需要是多平台的,因此很遗憾不能使用CLR。
答案 0 :(得分:1)
您正在寻找的是绑定到现有对象的方法指针,就是这样吗?
您应该查看boost::bind。如果您的环境支持它,如果它支持C ++ 11,您也可以使用std::tr1::bind
甚至std::bind
。
说明你想要的例子是:
struct X
{
bool f(int a);
};
X x;
shared_ptr<X> p(new X);
int i = 5;
bind(&X::f, ref(x), _1)(i); // x.f(i)
bind(&X::f, &x, _1)(i); //(&x)->f(i)
bind(&X::f, x, _1)(i); // (internal copy of x).f(i)
bind(&X::f, p, _1)(i); // (internal copy of p)->f(i)
最后两个例子很有趣,因为它们产生了“自包含”的功能对象。 bind(&amp; X :: f,x,_1)存储x的副本。 bind(&amp; X :: f,p,_1)存储p的副本,并且由于p是boost :: shared_ptr,函数对象保留对其X实例的引用,即使p退出,它也将保持有效。范围或重置()。
对于boost::bind
,std::tr1::bind
和std::bind
之间的差异,我们会看到this other question on SO.
答案 1 :(得分:0)
看看: http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible
它还将解释为什么C ++中的委托有点棘手。这个库在我读过的游戏开发书中被推荐(所以我假设速度非常快)。