template <typename T> class CDestructor; template <typename T1, typename T2> class CDestructor<T1 (*)(T2)> //模板特化,这里类型 T 特化为一个函数指针 T1(*)(T2),改函数参数一个为T2,返回类型为T1 { public: typedef T1 (*FuncPtr)(T2); CDestructor(FuncPtr fp, T2 param):m_ptr(fp), m_param(param) {}; ~CDestructor() {(*m_ptr)(m_param);}; private: T2 m_param; FuncPtr m_ptr; }; template<typename T1, typename T2> class CDestructor<T1 (__stdcall *)(T2)> { public: typedef T1 (__stdcall * FuncPtr)(T2); CDestructor(FuncPtr fp, T2 param):m_ptr(fp), m_param(param) {}; ~CDestructor() {(*m_ptr)(m_param);}; private: T2 m_param; FuncPtr m_ptr; }; //Usage sample HANDLE hd = ::CreateMutex(NULL, true, L"TestMutex"); ms::CDestructor<BOOL(__stdcall*)(HANDLE)> dstructor(CloseHandle, hd);