как бы передать в шаблон NULL или INVALID_HANDLE_VALUE
От: gid_vvp  
Дата: 28.08.06 15:00
Оценка:
Hi All

есть такой класс

template<
            typename TyHandle, 
            TyHandle (*TyInvalidValue)(), 
            void (*TyHandleClose)(TyHandle)
        >
class HandlePolicy
{
public:
    typedef TyHandle HandleType;
        
    static HandleType InvalidValue()
    {
        return TyInvalidValue();
    }

    static void HandleClose(HandleType handle)
    {
        if (IsValid(handle))
        {
            TyHandleClose(handle);
        }
    }

    static bool IsValid(HandleType handle)
    {
        return (handle != InvalidValue());
    }
};


сейчас используется так:

namespace fp
{
    HANDLE InvalidValue()
    {
        return INVALID_HANDLE_VALUE;
    }

    void HandleClose(HANDLE handle)
    {
        ::CloseHandle(handle);
    }
}

namespace sp
{
    HANDLE InvalidValue()
    {
        return INVALID_HANDLE_VALUE;
    }

    void HandleClose(HANDLE handle)
    {
        ::FindClose(handle);
    }
}

namespace ep
{
    HANDLE InvalidValue()
    {
        return NULL;
    }

    void HandleClose(HANDLE handle)
    {
        ::CloseHandle(handle);
    }
}

namespace mp
{
    HMODULE InvalidValue()
    {
        return NULL;
    }

    void HandleClose(HMODULE handle)
    {
        ::FreeLibrary(handle);
    }
}

...

typedef HandlePolicy<HANDLE, &fp::InvalidValue, &fp::HandleClose> FileHandlePolicy;
typedef HandlePolicy<HANDLE, &sp::InvalidValue, &sp::HandleClose> SearchHandlePolicy;
typedef HandlePolicy<HANDLE, &ep::InvalidValue, &ep::HandleClose> EventHandlePolicy;
typedef HandlePolicy<HMODULE, &mp::InvalidValue, &mp::HandleClose> ModuleHandlePolicy;

...



как бы так извернуться, чтоб можно было делать так, вместо того что выше:

typedef HandlePolicy<HANDLE, INVALID_HANDLE_VALUE, &::CloseHandle> FileHandlePolicy;
typedef HandlePolicy<HANDLE, INVALID_HANDLE_VALUE, &::FindClose> SearchHandlePolicy;
typedef HandlePolicy<HANDLE, NULL, &::CloseHandle> EventHandlePolicy;
typedef HandlePolicy<HMODULE,NULL, &::FreeLibrary> ModuleHandlePolicy;

...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.