句柄关闭模板

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

 

posted @ 2012-06-19 09:59  友学友  阅读(175)  评论(0)    收藏  举报