В общем случае - приходилось работать с данным "явлением". Однако сейчас, я столкнулся с "указателем на функцию-член класса".
Погуглил и вот что выудил (спешу поделиться с общественностью):
В моей программе (поток нафиг не по теме, но что-то придумать иного семпла, кроме как актуального кода не могу):
класс MyCl* сожержит структуру MyStr (структура с параметрами потока, которым класс управляет); в структуре содержатся данные о том, какую функцию из родительского экземпляра класса MyCl поток (дескриптор которого является компонентом структуры MyStr, входящей в состав класса MyCl, и получающий экземпляр структуры MyStr как бестиповой указатель в момент создания) должен запускать (при определённом стечении обстоятельств). Т.к. хотелось иметь универсальный инструмент и конфигурировать его в момент задания MyStr, пришлось отказаться от явного обращения к функции по имени.
Структура:
class MyCl;
struct MyStr{
HANDLE Thread;
THREAD_CONTROL Control;
MyCl *ParentInterface;
void (MyCl::*FunctionPtr)(WORD,void*,void*);
};
Класс (func1,func2,func3 - большое разнообразие возможных функций):
class MyCl{
private:
MyStr ControlThread;
void func1(WORD,void*,void*);
void func2(WORD,void*,void*);
void func3(WORD,void*,void*);
public:
MyCl();
~MyCl();
}
Функция, которую выполняет поток
DWORD WINAPI ThreadFunction(PVOID);
DWORD WINAPI ThreadFunction(PVOID Param){
MyStr *PC=(MyStr*)Param;
while (true){
(PC->ParentInterface->*(PC->FunctionPtr))(0,0,0);
Sleep(5000);
if(PC->Control==TH_STOP)break;
}
return 0;
}
Синим выделена, выносящая мозг конструкция, являющаяся вызовом функции, по указателю FunctionPtr, из экземпляра ParentInterface.
Как получить адрес функции:
ControlThread.FunctionPtr=&MyCl::func1;
В ParentInterface запихивается указатель на родительский экземпляр MyCl.
Меняя эту строку, можно программировать поведение потока, не нагромождая конструкции из всех возможных
case
*-имена вымышлены, куски кода выкинуты для упрощения пониамния; в действительности код грамотно разбит на объявление и реализацию.