Объединение функций, связывания, C++ и управляемого кода
У меня есть функция 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++ таким образом, что не имеет значения, является ли переданная функция статической или функцией-членом. И мне не понятно, как это сделать из управляемого кода.
1 ответ
Вы не можете привязать метод экземпляра управляемого класса по своему замыслу. Сборщик мусора перемещает объект при сжатии кучи, заставляя это измениться. Вам нужно будет использовать управляемого делегата. Таким образом, вы не можете избежать встроенного вспомогательного класса, который обеспечивает стабильный обратный вызов, необходимый для вашей функции<>. Оттуда вы можете вернуться к управляемому коду с помощью Marshal::GetFunctionPointerForDelegate().