rub*_*nvb 161 c++ typedef c++11
我想写这个
typedef void (*FunctionPtr)();
Run Code Online (Sandbox Code Playgroud)
使用using
.我该怎么办?
0x4*_*2D2 171
它具有类似的语法,除了从指针中删除标识符:
using FunctionPtr = void (*)();
Run Code Online (Sandbox Code Playgroud)
这是一个例子
如果你想"消除丑陋",试试Xeo建议:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Run Code Online (Sandbox Code Playgroud)
这是另一个演示.
小智 41
如果你避免使用typedef一个指针,也可以删除"丑陋":
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
Run Code Online (Sandbox Code Playgroud)
And*_*zos 12
你想要一个type-id
,除了你删除之外,它基本上与声明完全相同declarator-id
.在declarator-id
通常是一个标识符,和名字你在equivilant声明宣布.
例如:
int x
Run Code Online (Sandbox Code Playgroud)
这declarator-id
是x
删除它:
int
Run Code Online (Sandbox Code Playgroud)
同样:
int x[10]
Run Code Online (Sandbox Code Playgroud)
删除x
:
int[10]
Run Code Online (Sandbox Code Playgroud)
对于你的例子:
void (*FunctionPtr)()
Run Code Online (Sandbox Code Playgroud)
这里declarator-id
是FunctionPtr
.所以只需将其删除即可获得type-id
:
void (*)()
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为给定a,type-id
您始终可以唯一地确定标识符创建声明的位置.从标准8.1.1开始:
如果构造是[声明],则可以唯一地识别[type-id]中将出现标识符的位置.然后,命名类型与假设标识符的类型相同.
为清晰起见,这种语法怎么样?(注意双括号)
void func();
using FunctionPtr = decltype((func));
Run Code Online (Sandbox Code Playgroud)
另一种方法可能使用带有尾随返回类型的自动返回类型。
using FunctionPtr = auto (*)(int*) -> void;
Run Code Online (Sandbox Code Playgroud)
这有一个值得商榷的优点,即当别名以“auto(*)”开头并且不会被标识符名称混淆时,能够判断出某个东西是函数 ptr。
比较
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
Run Code Online (Sandbox Code Playgroud)
和
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Run Code Online (Sandbox Code Playgroud)
免责声明:我摘自 Bean Deane 的“Easing into Modern C++”演讲
归档时间: |
|
查看次数: |
51399 次 |
最近记录: |