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