我想写这个
typedef void (*FunctionPtr)();
使用using
. 我该怎么做?
如果您避免对指针进行类型定义,也可以消除“丑陋”:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
你想要一个type-id
,它基本上与声明完全相同,只是你删除了declarator-id
. 通常declarator-id
是一个标识符,以及您在等效声明中声明的名称。
例如:
int x
declarator-id
就是这样x
删除它:
int
同样地:
int x[10]
删除x
:
int[10]
对于您的示例:
void (*FunctionPtr)()
这里declarator-id
是FunctionPtr
。所以只需将其删除即可获得type-id
:
void (*)()
这是有效的,因为给定一个type-id
你总是可以唯一地确定标识符将去哪里创建一个声明。从标准中的 8.1.1 开始:
如果构造是 [declaration],则可以在 [type-id] 中唯一标识标识符将出现的位置。命名类型与假设标识符的类型相同。
为了清楚起见,这个语法怎么样?(注意双括号)
void func();
using FunctionPtr = decltype((func));
另一种方法可能使用带有尾随返回类型的自动返回类型。
using FunctionPtr = auto (*)(int*) -> void;
当别名以“auto(*)”开头并且它不会被标识符名称混淆时,这具有可以说是函数 ptr 的可争论的优势。
相比
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
和
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
免责声明:我从 Bean Deane 的“轻松进入现代 C++”演讲中摘录