我想把这个写下来

typedef void (*FunctionPtr)();

使用使用。我该怎么做呢?


当前回答

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

using FunctionPtr = auto (*)(int*) -> void;

这有一个值得争论的优势,即当别名以“auto(*)”开头时,能够判断某个东西是函数ptr,并且它不会被标识符名称混淆。

比较

typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);

with

using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;

免责声明:我从Bean Deane的“轻松进入现代c++”演讲中截取了这段话

其他回答

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

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

http://ideone.com/e1XuYc

您需要一个type-id,它本质上与声明完全相同,只是删除了声明器-id。声明器-id通常是一个标识符,而您在等价声明中声明的名称。

例如:

int x

声明器-id是x,所以只需删除它:

int

同样的:

int x[10]

去掉x:

int[10]

举个例子:

void (*FunctionPtr)()

这里的声明器id是FunctionPtr。所以只要移除它就能得到type-id:

void (*)()

这是可行的,因为给定一个类型id,您总是可以唯一地确定标识符将在哪里创建声明。从标准的8.1.1开始:

可以在[type-id]中唯一地标识标识符将出现的位置 如果建筑是一个[宣言]。类型的类型与命名类型相同 假设的标识符。

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

using FunctionPtr = auto (*)(int*) -> void;

这有一个值得争论的优势,即当别名以“auto(*)”开头时,能够判断某个东西是函数ptr,并且它不会被标识符名称混淆。

比较

typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);

with

using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;

免责声明:我从Bean Deane的“轻松进入现代c++”演讲中截取了这段话

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

void func();
using FunctionPtr = decltype((func));

它有一个类似的语法,除了你从指针上删除标识符:

using FunctionPtr = void (*)();

下面是一个例子

如果你想“去除丑陋”,试试Xeo的建议:

#include <type_traits>

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

这是另一个演示。