Answers:
它具有相似的语法,只是您从指针中删除了标识符:
using FunctionPtr = void (*)();
这是一个例子
如果您想“摆脱丑陋”,请尝试Xeo的建议:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
这是另一个演示。
:(
using FunctionPtr = AddPointer<void()>;
;)
add_pointer<void()>::type
:使用此处的建议:groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/…您可以编写pointer<function<void>>
。
如果避免键入指针,则也可以删除“丑陋”:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
后面的内容并得到令人困惑的错误。
您需要一个type-id
与声明完全相同的声明,只是删除declarator-id
。在declarator-id
通常是一个标识符,和名字你在equivilant声明宣布。
例如:
int x
该declarator-id
是x
这样只是将其删除:
int
同样地:
int x[10]
删除x
:
int[10]
例如:
void (*FunctionPtr)()
这里declarator-id
是FunctionPtr
。因此只需将其删除即可type-id
:
void (*)()
这是可行的,因为给定a时,type-id
您始终可以唯一地确定标识符在哪里创建声明。从标准的8.1.1开始:
如果构造是[声明],则可以唯一标识[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 ++”演讲中获得的
using
确实非常conf ,尤其是因为函数指针标识符通常位于typedef
语句的中间,并使用移到最前面using
。至少那是我迷路的地方。