我正在尝试从函数原型(prototype)的模板参数声明函数指针

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

DllFunction<int(int)> f;

但是我得到这个错误:

最佳答案

您正在混合两种不同的方式。

或者,您声明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;

10-06 14:52