Направлять указатель на функцию-член в обычный указатель

В настоящее время у меня есть class такого рода, сокращенный для простоты:

class MyClass { public: MyClass(); void* someFunc(void* param); } 

Теперь мне нужно вызвать функцию такого типа (не являющуюся членом какого-либо classа и которую я, к сожалению, не могу изменить ), но которую мне нужно вызвать в любом случае:

 void secondFunc(int a, int b, void *(*pCallback)(void*)); 

Теперь мне нужно передать адрес someFunc экземпляра.

Не работает образец:

 MyClass demoInstance; // some other calls secondFunc( 1, 2, demoInstance::someFunc() ); 

Я также пробовал использовать такие роли, как:

 (void* (*)(void*)) demoInstance::someFunc; reinterpret_cast(demoInstance::someFunc); 

Как я могу вызвать эту функцию с помощью функции-члена classа как параметра, чтобы ее можно было использовать как обратный вызов?

Любая идея или замечание оценены. Спасибо и привет

Разница между функцией C и функцией-членом C ++ заключается в том, что функция C использует соглашение о вызове cdecl , в то время как функции-члены используют этот вызов вызова (и вы даже не можете взять их адрес!).

Насколько я понимаю, вы действительно хотите, чтобы secondFunc() вызывал функцию-член определенного экземпляра classа (назовем this ). Ну, адреса функций-членов всех экземпляров определенного classа одинаковы. Чтобы передать указатель на объект, вам понадобится боковой канал. В этом случае это может быть статическая переменная. Или, если вы хотите поддержку MT, вам придется использовать Thread Local Storage (TLS),

Для этого требуется один обратный вызов для SomeFunc типа, но вам все равно нужен диспетчер.

Вы не можете напрямую вызвать функцию-член. Указатели функций-членов не такие же, как указатели на функции.

Вам нужно каким-то образом обернуть его в совместимую функцию. Однако, если ваша внешняя функция (та, которая принимает указатель функции как аргумент), не является повторной и не предоставляет дополнительный аргумент для использования указателем функции, вы не сможете передать экземпляр, по которому член функция работает, поэтому вы фактически не сможете выполнить вызов.

Существует круглый способ сделать это. Поскольку имена C ++ искажены, вы не можете напрямую использовать его для нестатических функций. Однако, поскольку нестатические функции имеют те же подписи, что и функции C, вы можете напрямую использовать их в качестве обратных вызовов. Поэтому для нестатических функций вы можете иметь статические функции-обертки. На этой странице подробно описан этот подход.

 class MyClass { public: MyClass(); void* someFunc(void* param); }; void* callback(void*) { MyClass instance; instance.someFunc(0 /* or whatever */); } void foo() { secondFunc( 1, 2, callback); } 

См. Этот пример:

 #include  class MyClass { public: MyClass() { } void* someFunc(void* param) { std::cout << "someFunc" << std::endl; return (void*)0; } }; typedef void* (MyClass::*MemFun)(void*); void secondFunc(int a, int b, MemFun fn) { MyClass* ptr = 0; // This is dangerous! If the function someFunc do not operate the data in the class. // You can do this. (ptr->*fn)(0); std::cout << "Call me successfully!" << std::endl; } int main() { secondFunc(1, 2, &MyClass::someFunc); system("pause"); return 0; } 

Не видел, чтобы часть о невозможности изменить вторую функцию раньше.

Определите структуру с указателями на функцию-член и объект:

 struct MyData { MyStruct *myInstance; (void *)(MyStruct::myFunction)(void *data); void * dataPointer ; } 

Создайте функцию, которая может вызвать правильный метод:

 void *proxyFunc( MyData *data) { return (data->myInstance->*(data->myFunction))(data->dataPointer); } 

Затем вызовите функцию 2 как:

 MyData dataP = { someInstance, &MyStruct::someFunc, &dataPtr }; secondFunc(proxyFunc, &dataP); 
  • Изменение константы с помощью указателя не const
  • C ++ standard: разыменование NULL-указателя для получения ссылки?
  • Функция не меняет пройденный указатель C ++
  • Когда следует использовать static_cast, dynamic_cast, const_cast и reinterpret_cast?
  • Ошибка сегментации при изменении строки с помощью указателей?
  • Это хорошая идея для указателей typedef?
  • Одномерный доступ к многомерному массиву: хорошо ли оно определено?
  • Как изменить указатель, который был передан в функцию в C?
  • Передайте двумерный массив функции постоянного параметра
  • В C, являются указателями массивов или используются в качестве указателей?
  • Почему я могу изменить локальную константную переменную с помощью указателей, но не глобальную в C?
  • Interesting Posts
    Давайте будем гением компьютера.