【问题标题】:How do I typedef a function pointer with the C++11 using syntax?如何使用 C++11 使用语法对函数指针进行类型定义?
【发布时间】:2013-05-06 02:59:10
【问题描述】:

我想写这个

typedef void (*FunctionPtr)();

使用using。我该怎么做?

【问题讨论】:

  • 确实非常 confusing,特别是因为函数指针标识符通常位于 typedef 语句的中间,并使用 using 移到前面。至少那是我迷路的地方。

标签: c++ c++11 typedef


【解决方案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++”演讲

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2022-11-25
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多