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-idist xso einfach entfernen:
int
Gleichfalls:
int x[10]
Entfernen Sie die x:
int[10]
Für Ihr Beispiel:
void (*FunctionPtr)()
Hier declarator-idist das FunctionPtr. Entfernen Sie es einfach, um Folgendes zu erhalten type-id:
void (*)()
Dies funktioniert, da type-idSie 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 einertypedefAnweisung befanden und mit nach vorne verschoben wurdenusing. Zumindest bin ich dort verloren.