объявить указатель на функцию в шаблонном классе из аргументов шаблона - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь объявить указатель на функцию из аргумента шаблона прототипа функции

template <typename ReturnType, typename... Args> class DllFunction {
public:
  ReturnType (*fptr_)(Args...);
};

DllFunction<int(int)> f;

, но получаю эту ошибку:

ошибка: C2091: функция возвращает функцию

1 Ответ

0 голосов
/ 25 февраля 2019

Вы смешиваете два разных способа.

Или вы объявляете 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;
...