如何使用语法使用C++ 11输入函数指针?

rub*_*nvb 161 c++ typedef c++11

我想写这个

typedef void (*FunctionPtr)();
Run Code Online (Sandbox Code Playgroud)

使用using.我该怎么办?

0x4*_*2D2 171

它具有类似的语法,除了从指针中删除标识符:

using FunctionPtr = void (*)();
Run Code Online (Sandbox Code Playgroud)

这是一个例子

如果你想"消除丑陋",试试Xeo建议:

#include <type_traits>

using FunctionPtr = std::add_pointer<void()>::type;
Run Code Online (Sandbox Code Playgroud)

这是另一个演示.

  • @Xeo我并不完全相信它更具可读性. (23认同)
  • Dang,我希望它会带走丑陋的:(` (21认同)
  • @rubenvb:`using FunctionPtr = AddPointer <void()>;`;) (10认同)
  • 在C++ 14中,您将能够编写:using FunctionPtr = std :: add_pointer_t <void()>; (10认同)
  • 这些类型别名将类型语法从模糊的,由内向外的语法更改为简单的从左到右的语法,这大大消除了对特定API的自定义typedef的需要,这使得更容易编写API的复合类型. (5认同)
  • 我认为std :: add_pointer_t也应该在答案中 (3认同)
  • 可以使用模板类型别名来进一步清理`add_pointer <void()> :: type`:使用以下建议:https://groups.google.com/a/isocpp.org/d/msg/std- proposal/xDQR3y5uTZ0/VKmOiLRzHqkJ你可以写`pointer <function <void >>`. (2认同)
  • 后者比前者丑陋得多。 (2认同)

小智 41

如果你避免使用typedef一个指针,也可以删除"丑陋":

void f() {}
using Function_t = void();    
Function_t* ptr = f;
ptr();
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/e1XuYc


And*_*zos 12

你想要一个type-id,除了你删除之外,它基本上与声明完全相同declarator-id.在declarator-id通常是一个标识符,和名字你在equivilant声明宣布.

例如:

int x
Run Code Online (Sandbox Code Playgroud)

declarator-idx删除它:

int
Run Code Online (Sandbox Code Playgroud)

同样:

int x[10]
Run Code Online (Sandbox Code Playgroud)

删除x:

int[10]
Run Code Online (Sandbox Code Playgroud)

对于你的例子:

void (*FunctionPtr)()
Run Code Online (Sandbox Code Playgroud)

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

void (*)()
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为给定a,type-id您始终可以唯一地确定标识符创建声明的位置.从标准8.1.1开始:

如果构造是[声明],则可以唯一地识别[type-id]中将出现标识符的位置.然后,命名类型与假设标识符的类型相同.


Leo*_*adt 9

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

void func();
using FunctionPtr = decltype((func));
Run Code Online (Sandbox Code Playgroud)

  • 你的`FunctionPtr`不是函数指针,但`decltype(&f)`是,见[here](http://coliru.stacked-crooked.com/view?id=77def487d5ed99885c0523d48c2ae7a1-50d9cfc8a1d350e7409e81e87c2653ba). (5认同)

Sil*_*ter 8

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

using FunctionPtr = auto (*)(int*) -> void;
Run Code Online (Sandbox Code Playgroud)

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

比较

typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
Run Code Online (Sandbox Code Playgroud)

using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Run Code Online (Sandbox Code Playgroud)

免责声明:我摘自 Bean Deane 的“Easing into Modern C++”演讲