199

我想写这个

typedef void (*FunctionPtr)();

使用using. 我该怎么做?

4

5 回答 5

225

它具有类似的语法,只是您从指针中删除了标识符:

using FunctionPtr = void (*)();

这是一个例子

如果您想“消除丑陋”,请尝试 Xeo 的建议:

#include <type_traits>

using FunctionPtr = std::add_pointer<void()>::type;

这是另一个演示

于 2013-05-11T15:50:50.503 回答
57

如果您避免对指针进行类型定义,也可以消除“丑陋”:

void f() {}
using Function_t = void();    
Function_t* ptr = f;
ptr();

http://ideone.com/e1XuYc

于 2014-05-19T14:45:26.447 回答
14

你想要一个type-id,它基本上与声明完全相同,只是你删除了declarator-id. 通常declarator-id是一个标识符,以及您在等效声明中声明的名称。

例如:

int x

declarator-id就是这样x删除它:

int

同样地:

int x[10]

删除x

int[10]

对于您的示例:

void (*FunctionPtr)()

这里declarator-idFunctionPtr。所以只需将其删除即可获得type-id

void (*)()

这是有效的,因为给定一个type-id你总是可以唯一地确定标识符将去哪里创建一个声明。从标准中的 8.1.1 开始:

如果构造是 [declaration],则可以在 [type-id] 中唯一标识标识符将出现的位置。命名类型与假设标识符的类型相同。

于 2013-05-12T06:36:44.477 回答
10

为了清楚起见,这个语法怎么样?(注意双括号)

void func();
using FunctionPtr = decltype((func));
于 2013-05-16T18:06:12.293 回答
4

另一种方法可能使用带有尾随返回类型的自动返回类型。

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++”演讲中摘录

于 2018-08-31T08:47:53.293 回答