如何在C ++ / CLI中使用boost :: bind绑定托管类的成员 [英] How to use boost::bind in C++/CLI to bind a member of a managed class

查看:361
本文介绍了如何在C ++ / CLI中使用boost :: bind绑定托管类的成员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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

  #include< boost / bind.hpp> 

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

void OnSomeEvent(void)
{
}
};


解决方案

虽然你的答案有效,但它暴露了一些你的实现到世界(Managed :: OnSomeEvent)。如果您不希望人们能够通过调用OnSomeEvent()来提升OnChange事件,则可以如下更新受管类(基于这个建议):

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

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

事件ChangeHandler ^ OnChange;

private:
void OnSomeEvent(void);
本机*本机;
回调*回调;
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);
删除回调;
if(gch.IsAllocated)
{
gch.Free();
}
}

void Managed :: OnSomeEvent(void)
{
OnChange
}

请注意备用 bind< R>() / code>表单。


I am using boost::signal in a native C++ class, and I now I am writing a .NET wrapper in C++/CLI, so that I can expose the native C++ callbacks as .NET events. When I try to use boost::bind to take the address of a member function of my managed class, I get compiler error 3374, saying I cannot take the address of a member function unless I am creating a delegate instance. Does anyone know how to bind a member function of a managed class using boost::bind?

For clarification, the following sample code causes Compiler Error 3374:

#include <boost/bind.hpp>

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

    void OnSomeEvent(void)
    {
    }
};

解决方案

While your answer works, it exposes some of your implementation to the world (Managed::OnSomeEvent). If you don't want people to be able to raise the OnChange event willy-nilly by invoking OnSomeEvent(), you can update your Managed class as follows (based on 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();
}

Note the alternate bind<R>() form that's used.

这篇关于如何在C ++ / CLI中使用boost :: bind绑定托管类的成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆