我正在写 C#。我喜欢使用event
. 我的班级很自然地只发布事件而不关心他们将处理谁以及如何处理。但是,由于我需要将代码迁移到 c++,我还应该使用event
吗?将这样的代码重写为 C++ 有多容易?使用其他更容易重写为 c++ 的技术可能有意义吗?
4 回答
.net 中的事件(包括 C#)只是对观察者设计模式的一种解释;这种相同模式的任何 C++ 实现都会有“相似”的行为。
编辑:一些关于主题的快速搜索链接:
使用什么代替c#事件来使代码易于移植到 c++?
如果您确定您的想法仅与event相关,那么我认为您无需进行任何更改。
只需为event编写一个底层类,即可达到您的目标。
你可能有各种方法可以做。第一步是考虑回调。
这里我提供了一些代码,例如,通过 P-invoke 调用 c++ 回调并在 c# 中包装到委托中。
导入回调:
[DllImport("devlink.dll")]
static extern int DLRegisterType2CallDeltas(uint pbxh,DLCALLLOGEVENT cb);
定义委托:
public delegate void DLCALLLOGEVENT(uint pbxh, StringBuilder info);
声明事件:
public event EventHandler<CallLogEventArgs> CallLogEvent;
包装要调用的事件:
DLRegisterType2CallDeltas(
pbxHandle,
(pbxh, info) => {
lock(thisLock)
if(
default(EventHandler<CallLogEventArgs>)!=CallLogEvent
&&
pbxHandle==pbxh
)
CallLogEvent(this, new CallLogEventArgs(info));
}
);
你需要在 C++中做一些反转/反转的事情。但首先,为事件或委托实现一个类会让你更接近完成你所要求的。
您可以使用 lambdas 和 std::function 在 C++11 中轻松实现事件。
如果有疑问,您总是可以直接回到 Windows API。查看事件等。http://msdn.microsoft.com/en-us/library/windows/desktop/ms686364(v=vs.85).aspx。
我已经有好几年没有写过 c++ 了,但那时我很高兴地使用了这些。在.net 世界中,System.Threading 中有包装器,但在底层它们是相同的。
显然,我在这里假设您的目标是(并且将仍然是)Windows。这有点像大锤的方法,但我认为它是万无一失的。