0

我正在尝试专门化一个声明为这样的类模板:

template<typename T> class A;

对于返回函数指针的函数。这需要是任何给定功能的通用签名。

因此,假设我知道 C/C++ 语法是如何工作的,那么对于返回某种类型的函数,特化应该看起来像这样ResultType

template<typename ResultType, typename Arg1, typename Arg2>
A<ResultType(Arg1, Arg2)> {...};

并将其扩展为 ResultType 作为函数指针应该如下所示:

template<typename FpResultType, typename FpArg1, typename Arg1, typename Arg2>
A<(ResultType(*)(FpArg1))(Arg1, Arg2)> {...};

但是,这会导致 GCC 4.6 上出现“无效的模板参数”。

据我所知,typedef 在这里是不行的。添加一个实用程序类来为我创建一个 typedef 也是不行的,因为这会将类型从模板声明中的类型名列表移动到另一个模板类型中,并将它们从 A 的模板专业化中“隐藏”(导致编译-声明的类型名未在特化中使用的时间错误)。

我宁愿避免拥有长而复杂的 enable_ifs 和实用程序结构链。但是,如果这是唯一的方法,嗯。

4

1 回答 1

2

我相信如果您将其专门化为:

template<typename FpResultType, typename FpArg1, typename Arg1, typename Arg2>
A<ResultType (*(Arg1, Arg2))(FpArg1)> {...};

我用下面的代码进行了测试,它编译成功(使用 Clang):

template<typename T> class A;

template<typename FnRetT, typename FnArgT, typename Arg1, typename Arg2>
class A<FnRetT (*(Arg1, Arg2))(FnArgT)>
{
public:
  typedef FnRetT fn_ret_t;
};

float foo(float a)
{
  return a;
}

float (*getfn(int arg1, int arg2))(float)
{
  return foo;
}

int main(int argc, const char * argv[])
{
  typedef A<decltype(getfn)>::fn_ret_t ret_ty;

  return 0;
}

请注意,用于匹配函数类型的语法与getfn.

于 2013-06-26T05:46:30.043 回答