我正在尝试专门化一个声明为这样的类模板:
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和实用程序结构。但是,如果这是唯一的方法,那么。
答案 0 :(得分: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
的声明匹配。