Вы смешиваете два разных способа.
Или вы объявляете DllFunction
, получая возвращаемый и переменный список типов аргументов
template <typename ReturnType, typename... Args> class DllFunction {
public:
ReturnType (*fptr_)(Args...);
};
, но вы должны избегать его вызовас формой int(int)
и вам нужно использовать
// .........VVV return type
DllFunction<int, int> f;
// ..............^^^ arguments types
, или вы звоните с использованием формы ReturnType(Args...)
, и вам необходимо объявить DllFunction
объект следующим образом
template <typename>
class DllFunction;
template <typename ReturnType, typename... Args>
class DllFunction<ReturnType(Args...)> {
public:
ReturnType (*fptr_)(Args...);
};
Вы также можете использовать функцию указателя в форме
template <typename>
class DllFunction;
template <typename ReturnType, typename... Args>
class DllFunction<ReturnType(*)(Args...)> {
public:
ReturnType (*fptr_)(Args...);
};
, чтобы вы могли использовать decltype()
для типа шаблона
int foo (int);
DllFunction<decltype(&foo)> f;