gpt4 book ai didi

delegates - 如何在 C++/CLI 中使用 boost::bind 绑定(bind)托管类的成员

转载 作者:行者123 更新时间:2023-12-04 02:01:04 25 4
gpt4 key购买 nike

我在 native C++ 类中使用 boost::signal,现在我正在 C++/CLI 中编写一个 .NET 包装器,以便我可以将 native C++ 回调公开为 .NET 事件。当我尝试使用 boost::bind 获取托管类的成员函数的地址时,我收到编译器错误 3374,说除非我创建委托(delegate)实例,否则我无法获取成员函数的地址。有谁知道如何使用 boost::bind 绑定(bind)托管类的成员函数?

为澄清起见,以下示例代码会导致编译器错误 3374:

#include <boost/bind.hpp>

public ref class Managed
{
public:
Managed()
{
boost::bind(&Managed::OnSomeEvent, this);
}

void OnSomeEvent(void)
{
}
};

最佳答案

虽然您的答案有效,但它会将您的一些实现暴露给世界(Managed::OnSomeEvent)。如果您不希望人们能够通过调用 OnSomeEvent() 随意引发 OnChange 事件,您可以按如下方式更新您的 Managed 类(基于 this advice ):

public delegate void ChangeHandler(void);
typedef void (__stdcall *ChangeCallback)(void);

public ref class Managed
{
public:
Managed(Native* Nat);
~Managed();

event ChangeHandler^ OnChange;

private:
void OnSomeEvent(void);
Native* native;
Callback* callback;
GCHandle gch;
};

Managed::Managed(Native* Nat)
: native(Nat)
{
callback = new Callback;

ChangeHandler^ handler = gcnew ChangeHandler( this, &Managed::OnSomeEvent );
gch = GCHandle::Alloc( handler );
System::IntPtr ip = Marshal::GetFunctionPointerForDelegate( handler );
ChangeCallback cbFunc = static_cast<ChangeCallback>( ip.ToPointer() );

*callback = native->RegisterCallback(boost::bind<void>( cbFunc ) );
}

Managed::~Managed()
{
native->UnregisterCallback(*callback);
delete callback;
if ( gch.IsAllocated )
{
gch.Free();
}
}

void Managed::OnSomeEvent(void)
{
OnChange();
}

注意备用 bind<R>()使用的表格。

关于delegates - 如何在 C++/CLI 中使用 boost::bind 绑定(bind)托管类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/163757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com