使用智能指针C++时的 C# 委托等效项



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

您要查找的是绑定到现有对象的方法指针,仅此而已?

你应该看看 boost::bind.如果您的环境支持它,您还可以使用 std::tr1::bind 甚至std::bind如果它支持 C++11。

说明您想要的示例是:

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(&X::f, x, _1) 存储 x 的副本。 bind(&X::f, p, _1) 存储 p 的副本,由于 p 是 boost::shared_ptr,函数对象保留对其 X 实例的引用,即使 p 超出范围或被 reset() 也保持有效。

对于boost::bindstd::tr1::bindstd::bind之间的区别,我让你看看SO上的另一个问题。

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

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

相关内容

  • 没有找到相关文章

最新更新