如何使用 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&lt;void()&gt;; ;) 可以使用模板类型别名进一步清理add_pointer&lt;void()&gt;::type:使用这里的建议:groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… 你可以写pointer&lt;function&lt;void&gt;&gt; 这些类型别名将类型语法从晦涩的、由内而外的语法更改为简单的从左到右的语法,这在很大程度上消除了对特定 API 的自定义 typedef 的需要,从而更容易编写API 的复合类型。 在 C++14 中,您将能够编写: using FunctionPtr = std::add_pointer_t;【参考方案2】:

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

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

http://ideone.com/e1XuYc

【讨论】:

这是一个有趣的方法,虽然我可能会担心我以后会忘记 * 并得到令人困惑的错误。 这绝对是这里展示的最好的版本。谢谢你。而且我更喜欢看到一个指针,因为它毕竟是一个函数指针。【参考方案3】:

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

例如:

int x

declarator-idx,所以删除它:

int

同样:

int x[10]

删除x:

int[10]

你的例子:

void (*FunctionPtr)()

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

void (*)()

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

双括号在这种情况下是什么意思?对函数指针的引用 您的FunctionPtr 不是函数指针,但decltype(&amp;f) 是,请参阅here。 @1234597890 FunctionPtr 是对类型 'void ()' 的非常量左值引用 @rubenvb:你是对的。它不是函数指针,而是对函数(类型)的左值引用。这就是 static_assert 失败的原因... 尝试使用 FunctionPtr: using namespace std; #include void do_f() cerr 【参考方案5】:

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

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 使用语法对函数指针进行类型定义?的主要内容,如果未能解决你的问题,请参考以下文章

[C++11]通过using定义基础类型和函数指针别名

实验11——指针的基础应用

C指针原理(27)-编译基本原理-语法树及其实现7

C语言语法

C++11重点语法

C++11重点语法