如何在C++中无类型转换实现返回自身指针的函数?
在C++里不用类型转换实现函数返回自身指针
问题场景
C语言里可以靠类型转换让函数返回自己的指针,代码是这样的:
typedef void (*voidfunc)(); voidfunc f(int) { return (voidfunc) f; }
但这种写法依赖强制类型转换,现在要在C++里实现不用类型转换的版本,就是补全下面代码里的???:
??? f(int) { return f; }
试了直接用auto不行:
auto f(int) { return f; }
模板的路子也走不通。
可行方案
方案1:先定义匹配的函数指针类型
先给和f签名完全一致的函数指针整个类型别名,C++允许这种递归的指针类型定义,直接拿这个别名当返回值就行:
using FuncPtr = FuncPtr(*)(int); FuncPtr f(int) { return f; }
方案2:用尾返回类型+decltype
要是不想提前定义类型别名,就用尾返回类型配合decltype,让编译器自己推导返回的函数指针类型,完全不用手动转:
auto f(int) -> decltype(f) { return f; }
或者写成带取地址的形式,效果一样:
auto f(int) -> decltype(f)* { return &f; }
为啥直接用auto不行?
单独写auto当返回值时,编译器得先推导返回类型,但return f里的f就是函数本身,这时候函数的返回类型还没确定,形成了循环依赖,编译器没法完成推导,自然就编译失败了。
内容的提问来源于stack exchange,提问作者6502
相关产品推荐
相关产品推荐

