gpt4 book ai didi

c++ - 通用函数返回函数指针的特化类

转载 作者:行者123 更新时间:2023-11-28 03:14:39 28 4
gpt4 key购买 nike

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

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 和实用程序结构链。但是,如果这是唯一的方法,嗯。

最佳答案

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

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 的声明相匹配。

关于c++ - 通用函数返回函数指针的特化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17312250/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com