我在C ++中有一个主题/观察者系统:
#include <vector>
class IObserver
{
public:
virtual void valueChanged(float pos) = 0;
};
class Subject
{
public:
static Subject *instance();
void subscribe(IObserver *observer);
private:
static Subject* m_instance;
std::vector<IObserver*> m_observers;
};
我需要在C#中实现一个观察者并订阅该主题。 我该怎么做?
我可以使用函数指针:
typedef void (*ValueChangedFunc)(float pos);
void SubscribeTovalueChanged(ValueChangedFunc func); // global but works on singleton
如何将C#成员函数转换为C ++函数指针并调用最后一个函数?
答案 0 :(得分:5)
C#无法实现C ++接口,需要从C ++完成。
您可以使用C ++ / CLI创建一个实现同样理解C#委托的接口的填充程序观察器,或者您可以使用标准C ++来创建一个实现接口并调用函数指针的填充程序观察器; C#委托可以转换为函数指针。
最后一种方法是让C ++代码使用C#可以实现的完整的COM接口(在IDL中描述),而不是最小的C ++接口。
对于带有函数指针的新代码:
首先,在C ++端指定调用约定。
typedef void (__stdcall *ValueChangedFunc)(float pos);
void __stdcall SubscribeToValueChanged(ValueChangedFunc func); // global but works on singleton
然后声明一个与函数指针typedef匹配的委托。
[UnmanagedFunctionPointer(CallingConvention.Stdcall)]
delegate void ValueChangedFunc(float);
然后声明消耗它的函数:
[DllImport(...)]
void SubscribeToValueChanged(ValueChangedFunc func);
请注意,本机代码中使用的函数指针对垃圾收集器不可见。只要存储了函数指针,保持委托活动就是你的责任。