我想把这个写下来
typedef void (*FunctionPtr)();
使用使用。我该怎么做呢?
我想把这个写下来
typedef void (*FunctionPtr)();
使用使用。我该怎么做呢?
当前回答
您需要一个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 = void (*)();
下面是一个例子
如果你想“去除丑陋”,试试Xeo的建议:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
这是另一个演示。
您需要一个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]中唯一地标识标识符将出现的位置 如果建筑是一个[宣言]。类型的类型与命名类型相同 假设的标识符。
为了清晰起见,这个语法怎么样?(注意双括号)
void func();
using FunctionPtr = decltype((func));
如果你避免对指针进行类型定义,那么“丑陋”也可以被消除:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
http://ideone.com/e1XuYc
另一种方法可能使用带有尾随返回类型的自动返回类型。
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++”演讲中截取了这段话