从模板参数声明模板化类中的函数指针

blu*_*gon 2 c++ templates generic-programming variadic-templates c++17

我试图从函数原型的模板参数声明函数指针

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

DllFunction<int(int)> f;
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

错误:C2091:函数返回功能

max*_*x66 6

你混合了两种不同的方式.

或者您声明DllFunction接收返回和参数类型的可变参数列表

template <typename ReturnType, typename... Args> class DllFunction {
public:
  ReturnType (*fptr_)(Args...);
};
Run Code Online (Sandbox Code Playgroud)

但你必须避免用表格调用它,int(int)你必须使用

// .........VVV  return type
DllFunction<int, int> f;
// ..............^^^  arguments types
Run Code Online (Sandbox Code Playgroud)

或者您使用表单调用ReturnType(Args...),您必须DllFunction按如下方式声明对象

template <typename>
class DllFunction;

template <typename ReturnType, typename... Args>
class DllFunction<ReturnType(Args...)> {
public:
  ReturnType (*fptr_)(Args...);
};
Run Code Online (Sandbox Code Playgroud)

您还可以使用指针函数表单

template <typename>
class DllFunction;

template <typename ReturnType, typename... Args>
class DllFunction<ReturnType(*)(Args...)> {
public:
  ReturnType (*fptr_)(Args...);
};
Run Code Online (Sandbox Code Playgroud)

所以你可以使用decltype()模板类型

int foo (int);

DllFunction<decltype(&foo)> f;
Run Code Online (Sandbox Code Playgroud)