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

时间:2019-02-25 13:57:00

标签: c++ templates c++17 variadic-templates generic-programming

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

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

DllFunction<int(int)> f;

但我收到此错误:

  

错误:C2091:函数返回函数

1 个答案:

答案 0 :(得分:6)

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

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