#ifndef POPUP_CALLBACK_CLASS #define POPUP_CALLBACK_CLASS class popupCallback; template class popupCallbackFunction; class popupCallback{ public: popupCallback(void){} ~popupCallback(void){} virtual void bind(void* newFun) = 0; virtual bool call(void) = 0; }; template class popupCallbackFunction : public popupCallback{ protected: R (*fun)(P1); P1 param_1; public: popupCallbackFunction(void); popupCallbackFunction(void * newFun, P1 param); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction::popupCallbackFunction(void){ this->fun = 0; this->param_1 = P1(); }; template popupCallbackFunction::popupCallbackFunction(void * newFun, P1 param){ this->fun = static_cast< R(*)(P1)>(newFun); this->param_1 = param; }; template void popupCallbackFunction::bind(void * newFun){ this->fun = static_cast< R(*)(P1)>(newFun); }; template bool popupCallbackFunction::call(void){ return (bool)(this->fun)(this->param_1); } // no return type, one parameter template class popupCallbackFunction : public popupCallback{ protected: void (*fun)(P1); P1 param_1; public: popupCallbackFunction(void); popupCallbackFunction(void * newFun, P1 param); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction::popupCallbackFunction(void){ this->fun = 0; this->param_1 = P1(); }; template popupCallbackFunction::popupCallbackFunction(void * newFun, P1 param){ this->fun = static_cast< void(*)(P1)>(newFun); this->param_1 = param; }; template void popupCallbackFunction::bind(void * newFun){ this->fun = static_cast< void(*)(P1)>(newFun); }; template bool popupCallbackFunction::call(void){ try { (this->fun)(this->param_1); } catch (...) { return false; } return true; } // returns something, no parameter template class popupCallbackFunction : public popupCallback{ protected: R (*fun)(void); public: popupCallbackFunction(void); popupCallbackFunction(void * newFun); virtual void bind(void * newFun); virtual bool call(void); }; template popupCallbackFunction::popupCallbackFunction(void){ this->fun = 0; }; template popupCallbackFunction::popupCallbackFunction(void * newFun){ this->fun = static_cast< R(*)(void)>(newFun); }; template void popupCallbackFunction::bind(void * newFun){ this->fun = static_cast< R(*)(void)>(newFun); }; template bool popupCallbackFunction::call(void){ return (bool)(this->fun)(); } //template<> //bool popupCallbackFunction::call(void){ // return (this->fun)(); //} // no parameters/return types template <> class popupCallbackFunction : public popupCallback{ protected: void (*fun)(void); public: popupCallbackFunction(void){ this->fun = 0; }; popupCallbackFunction(void * newFun){ this->fun = static_cast< void(*)(void)>(newFun); }; virtual void bind(void * newFun){ this->fun = static_cast< void(*)(void)>(newFun); }; virtual bool call(void){ try { (this->fun)(); } catch (...) { return false; } return true; }; }; class popupCallbackLua : public popupCallback{ protected: CHAR16 * functionName; public: popupCallbackLua(void); popupCallbackLua(CHAR16 * newFunctionName){ this->functionName = newFunctionName; }; virtual void bind(void * newFun){ this->functionName = static_cast< CHAR16* >(newFun); }; virtual bool call(void){ return true; }; }; #endif