【发布时间】:2013-05-06 02:59:10
【问题描述】:
我想写这个
typedef void (*FunctionPtr)();
使用using。我该怎么做?
【问题讨论】:
-
确实非常 conf
using,特别是因为函数指针标识符通常位于typedef语句的中间,并使用using移到前面。至少那是我迷路的地方。
我想写这个
typedef void (*FunctionPtr)();
使用using。我该怎么做?
【问题讨论】:
using,特别是因为函数指针标识符通常位于 typedef 语句的中间,并使用 using 移到前面。至少那是我迷路的地方。
【讨论】:
:(
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 通常是一个标识符,也是您在等效声明中声明的名称。
例如:
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 开始:
可以在 [type-id] 中唯一标识标识符出现的位置 如果构造是[声明]。命名类型与 假设标识符。
【讨论】:
为了清楚起见,这个语法怎么样? (注意双括号)
void func();
using FunctionPtr = decltype((func));
【讨论】:
FunctionPtr 不是函数指针,但decltype(&f) 是,请参阅here。
另一种方法可能使用带有尾随返回类型的自动返回类型。
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++”演讲
【讨论】: