Доброго времени суток!
Хочется написать кроссплатформенную обертку над LoadLibrary/GetProcAddress ( кстати странно, что например в boost'е её нет ) примерно со следующим интерфейсом:
auto lib = LoadLib( "cool.dll" );
auto func = lib.GetFunc<int(int, int)>( "cool_func" );
int res = func( 1, 42 );
Хочется чтобы func был функциональным объектом, т.е. реализовывал operator() с аргументами указанными в GetFunc. Почему не просто указателем? Хочется внутри еще подсчет ссылок для проверки отсутствия живых функций на момент выгрузки библиотеки, но это к вопросу не относится
Подумалось, что func реализовать можно как-то так. Но вот как бы сгенерировать parameter pack? Да и возможно ли это сделать? И если нет, то есть ли другие пути решение этой проблемы?
#include "boost/type_traits/function_traits.hpp"
template <typename T, typename... Args>
struct func_helper {
func_helper( T* a_func ) : i_func( a_func ) {}
typename boost::function_traits<T>::result_type operator()( Args... args ) {
return i_func( args... );
}
T* i_func;
};
template <typename T>
class func : func_helper<T, /* HELP ME */> {
public:
func( T* a_func ) : func_helper( a_func ) {
}
};