Я использую небольшой вспомогательный шаблон, чтобы обернуть различные функции Windows для освобождения ресурсов, такие как:
template <typename Resource, typename ReturnType, ReturnType (WINAPI *GlobalFn)( Resource )>
struct GlobalWINAPIFn {
inline void release( Resource r ) { (void)GlobalFn( r ); }
};
Экземпляры этого шаблона фактически передаются в качестве аргумента другому шаблону (который ожидаетвведите для предоставления функции release
, которая принимает тип Resource
).Этот помощник используется для простого переноса глобальных методов.
Я использую его как
// wraps BOOL WINAPI CloseHandle( HANDLE );
typedef GlobalWINAPIFn<HANDLE, BOOL, ::CloseHandle> HANDLEDestructor;
// wraps LONG WINAPI RegCloseKey( HKEY );
typedef GlobalWINAPIFn<HKEY, LONG, ::RegCloseKey> HKEYDestructor;
Это работает, но мне интересно - есть ли способ переписать шаблон, чтобы я могпросто напишите
typedef GlobalWINAPIFn<::CloseHandle> HANDLEDestructor;
typedef GlobalWINAPIFn<::RegCloseKey> HKEYDestructor;
а возвращаемые типы выводятся автоматически?Какой-то тип фабричной функции?