Как я могу позволить моему классу шаблона определять тип возврата и аргумента аргумента шаблона указателя на функцию - PullRequest
2 голосов
/ 05 мая 2011

Я использую небольшой вспомогательный шаблон, чтобы обернуть различные функции 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;

а возвращаемые типы выводятся автоматически?Какой-то тип фабричной функции?

1 Ответ

2 голосов
/ 05 мая 2011

Вы можете взглянуть на boost::function_traits http://www.boost.org/doc/libs/1_34_0/libs/functional/function_traits.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...