当C ++使用智能指针时,C#委托等效

时间:2012-12-11 08:29:19

标签: c# c++ smart-pointers

我主要是一个从事C ++项目的.NET程序员,我正在尝试确定处理使用Action和Function模板类型的委托的等效方法。我在.NET代码中使用委托作为事件和回调。我的C ++项目使用智能指针和与C#程序相同的委托设计模式。处理这种情况的最佳方法是什么?我不清楚如何传递和维护一个函数指针,该函数指针也跟踪智能指针并可能删除底层对象,因为事件容器使用弱引用。该库需要是多平台的,因此很遗憾不能使用CLR。

2 个答案:

答案 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::bindstd::tr1::bindstd::bind之间的差异,我们会看到this other question on SO.

答案 1 :(得分:0)

看看: http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

它还将解释为什么C ++中的委托有点棘手。这个库在我读过的游戏开发书中被推荐(所以我假设速度非常快)。