У меня есть набор классов для этой точной вещи, которые я использую в моей среде c ++.
http://code.google.com/p/kgui/source/browse/trunk/kgui.h
То, как я обращаюсь с этим, - каждая функция класса, которая может использоваться в качестве обратного вызова, нуждается в статической функции, которая связывает тип объекта с ней. У меня есть набор макросов, которые делают это автоматически. Он создает статическую функцию с тем же именем, за исключением префикса «CB_» и дополнительного первого параметра, который является указателем на объект класса.
Извлечение типов классов kGUICallBack и различных версий их шаблонов для обработки различных комбинаций параметров.
#define CALLBACKGLUE(classname , func) static void CB_ ## func(void *obj) {static_cast< classname *>(obj)->func();}
#define CALLBACKGLUEPTR(classname , func, type) static void CB_ ## func(void *obj,type *name) {static_cast< classname *>(obj)->func(name);}
#define CALLBACKGLUEPTRPTR(classname , func, type,type2) static void CB_ ## func(void *obj,type *name,type2 *name2) {static_cast< classname *>(obj)->func(name,name2);}
#define CALLBACKGLUEPTRPTRPTR(classname , func, type,type2,type3) static void CB_ ## func(void *obj,type *name,type2 *name2,type3 *name3) {static_cast< classname *>(obj)->func(name,name2,name3);}
#define CALLBACKGLUEVAL(classname , func, type) static void CB_ ## func(void *obj,type val) {static_cast< classname *>(obj)->func(val);}