如何使用 C++11 使用语法对函数指针进行类型定义?
Posted
技术标签:
【中文标题】如何使用 C++11 使用语法对函数指针进行类型定义?【英文标题】:How do I typedef a function pointer with the C++11 using syntax? 【发布时间】:2013-05-06 02:59:10 【问题描述】:我想写这个
typedef void (*FunctionPtr)();
使用using
。我该怎么做?
【问题讨论】:
确实非常 confusing
,特别是因为函数指针标识符通常位于 typedef
语句的中间,并使用 using
移到前面。至少那是我迷路的地方。
【参考方案1】:
它有类似的语法,除了你从指针中删除标识符:
using FunctionPtr = void (*)();
这是Example
如果你想“去掉丑陋”,试试 Xeo 的建议:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
这是另一个demo。
【讨论】:
当,我希望它能带走丑陋:(
@rubenvb: using FunctionPtr = AddPointer<void()>;
;)
可以使用模板类型别名进一步清理add_pointer<void()>::type
:使用这里的建议:groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… 你可以写pointer<function<void>>
。
这些类型别名将类型语法从晦涩的、由内而外的语法更改为简单的从左到右的语法,这在很大程度上消除了对特定 API 的自定义 typedef 的需要,从而更容易编写API 的复合类型。
在 C++14 中,您将能够编写: using FunctionPtr = std::add_pointer_t如果避免对指针进行类型定义,也可以消除“丑陋”:
void f()
using Function_t = void();
Function_t* ptr = f;
ptr();
http://ideone.com/e1XuYc
【讨论】:
这是一个有趣的方法,虽然我可能会担心我以后会忘记*
并得到令人困惑的错误。
这绝对是这里展示的最好的版本。谢谢你。而且我更喜欢看到一个指针,因为它毕竟是一个函数指针。【参考方案3】:
你想要一个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] 中唯一标识标识符出现的位置 如果构造是[声明]。命名类型与 假设标识符。
【讨论】:
【参考方案4】:为了清楚起见,这个语法怎么样? (注意双括号)
void func();
using FunctionPtr = decltype((func));
【讨论】:
双括号在这种情况下是什么意思?对函数指针的引用? 您的FunctionPtr
不是函数指针,但decltype(&f)
是,请参阅here。
@1234597890 FunctionPtr 是对类型 'void ()' 的非常量左值引用
@rubenvb:你是对的。它不是函数指针,而是对函数(类型)的左值引用。这就是 static_assert 失败的原因... 尝试使用 FunctionPtr: using namespace std; #include 另一种方法可能使用带有尾随返回类型的自动返回类型。
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++”演讲
【讨论】:
以上是关于如何使用 C++11 使用语法对函数指针进行类型定义?的主要内容,如果未能解决你的问题,请参考以下文章