结合函数、绑定、c++ 和托管代码

Combining function, bind, c++ and managed code

本文关键字:托管代码 c++ 绑定 函数 结合      更新时间:2023-10-16

我有一个 c++ 函数,它期望将函数对象(AuthenticateNotifyFunc)传递给它:

class lc_Authenticate
{
public:
   typedef enum {
     kAbort,
     kContinue
   } lc_AuthenticateStatus;
   typedef std::tr1::function<lc_AuthenticateStatus (const string &msg)> AuthenticateNotifyFunc;
   bool Authenticate(lc_AuthenticateParams &params,
                     AuthenticateNotifyFunc notifyFunc);
}

在一个托管的 c++ 项目中,我试图定义一个参数来传递给上面的函数,这样:

public ref class Form1 : public System::Windows::Forms::Form
{
    public:
    lc_Authenticate::lc_AuthenticateStatus UpdateStatus(const string &msg)
    {
        <<DO SOMETHING>>
        return(lc_Authenticate::kContinue);
    }
    void test()
    {
        string appKey, appSecret;
        appKey = GetString(this->appKeyTextBox->Text);
        appSecret = GetString(this->appSecretTextBox->Text);
        lc_Authenticate dbauth;
        lc_AuthenticateParams params(appKey, appSecret);
        //  DOESN'T COMPILE won't let me take address of member function
        // or know about _1
        lc_Authenticate::AuthenticateNotifyFunc func =
            std::tr1::bind(&Form1::UpdateStatus, this, _1);
        dbauth.Authenticate(params, func);
    }
};

所以我正在尝试实现一种将函数传递给 c++ 方法的通用方法,这样它就不在乎传递的函数是静态函数还是成员函数。而且我不清楚如何从托管代码中执行此操作。

根据设计,不能绑定到托管类的实例方法。 垃圾回收器在压缩堆时移动对象,导致此更改。 您需要使用托管委托。 因此,您无法避免使用本机帮助程序类,该类提供函数所需的稳定回调<>。 你可以从那里回到托管代码 Marshal::GetFunctionPointerForDelegate()。