我有一个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 ¶ms,
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 ++方法的泛型方法,使得它不关心传递的函数是静态函数还是成员函数。而且我不清楚如何从托管代码中做到这一点。
答案 0 :(得分:3)
您无法通过设计绑定到托管类的实例方法。压缩堆时,垃圾收集器会移动对象,导致此更改。您需要使用托管代理。因此,您无法避免使用本机助手类来提供函数所需的稳定回调&lt;&gt;。您可以使用Marshal :: GetFunctionPointerForDelegate()从那里返回托管代码。