Antworten:
Es hat eine ähnliche Syntax, außer dass Sie den Bezeichner aus dem Zeiger entfernen:
using FunctionPtr = void (*)();
Hier ist ein Beispiel
Wenn Sie "die Hässlichkeit wegnehmen" möchten, versuchen Sie, was Xeo vorgeschlagen hat:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Und hier ist eine weitere Demo .
:(
using FunctionPtr = AddPointer<void()>;
;)
add_pointer<void()>::type
: Verwenden Sie den Vorschlag hier: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/…, den Sie schreiben können pointer<function<void>>
.
Die "Hässlichkeit" kann auch beseitigt werden, wenn Sie die Eingabe eines Zeigers vermeiden:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
späteren zu vergessen und verwirrende Fehler zu bekommen.
Sie möchten eine type-id
, die im Wesentlichen genau der Deklaration entspricht, außer dass Sie die löschen declarator-id
. Dasdeclarator-id
ist normalerweise eine Kennung und der Name, den Sie in der gleichberechtigten Erklärung deklarieren.
Beispielsweise:
int x
Das declarator-id
ist x
so einfach entfernen:
int
Gleichfalls:
int x[10]
Entfernen Sie die x
:
int[10]
Für Ihr Beispiel:
void (*FunctionPtr)()
Hier declarator-id
ist das FunctionPtr
. Entfernen Sie es einfach, um Folgendes zu erhalten type-id
:
void (*)()
Dies funktioniert, da type-id
Sie mit a immer eindeutig bestimmen können, wohin der Bezeichner gehen soll, um eine Deklaration zu erstellen. Ab 8.1.1 im Standard:
Es ist möglich, den Ort in der [Typ-ID] eindeutig zu identifizieren, an dem der Bezeichner erscheinen würde, wenn die Konstruktion eine [Deklaration] wäre. Der benannte Typ ist dann der gleiche wie der Typ des hypothetischen Bezeichners.
Wie wäre es mit dieser Syntax für Klarheit? (Beachten Sie doppelte Klammern)
void func();
using FunctionPtr = decltype((func));
Ein anderer Ansatz könnte die Verwendung des automatischen Rückgabetyps mit dem nachfolgenden Rückgabetyp verwenden.
using FunctionPtr = auto (*)(int*) -> void;
Dies hat den fraglichen Vorteil, dass man sagen kann, dass etwas eine Funktion ptr ist, wenn der Alias mit "auto (*)" beginnt und nicht durch die Bezeichnernamen verschleiert wird.
Vergleichen Sie
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
mit
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Haftungsausschluss: Ich habe dies Bean Deanes Vortrag "Easing into Modern C ++" entnommen
using
, vor allem, weil sich Funktionszeiger- IDs normalerweise in der Mitte einertypedef
Anweisung befanden und mit nach vorne verschoben wurdenusing
. Zumindest bin ich dort verloren.