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);