Відповіді:
Він має подібний синтаксис, за винятком того, як ви видалите ідентифікатор з вказівника:
using FunctionPtr = void (*)();
Ось приклад
Якщо ви хочете "зняти потворність", спробуйте те, що запропонував Xeo:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
І ось ще одна демонстрація .
:(
using FunctionPtr = AddPointer<void()>;
)
add_pointer<void()>::type
: Використовуючи пропозицію тут: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… ви можете написати pointer<function<void>>
.
"Потворність" також може бути знята, якщо уникнути набору вказівника:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
пізніше і помилково помиляюся.
Ви хочете type-id
, який по суті точно такий же, як і декларація, за винятком того, що ви видаляєте declarator-id
. declarator-id
, Як правило , ідентифікатор, і ім'я , яке ви оголошуєте в equivilant декларації.
Наприклад:
int x
declarator-id
Це x
так просто видалити його:
int
Аналогічно:
int x[10]
Видаліть x
:
int[10]
Для вашого прикладу:
void (*FunctionPtr)()
Ось і declarator-id
є FunctionPtr
. тому просто видаліть його, щоб отримати type-id
:
void (*)()
Це працює, тому що, даючи a, type-id
ви завжди можете однозначно визначити, куди піде ідентифікатор для створення декларації. З 8.1.1 у стандарті:
Можна однозначно визначити розташування в [type-id], де ідентифікатор з'явиться, якби конструкція була [декларацією]. Тоді названий тип такий же, як і тип гіпотетичного ідентифікатора.
Як щодо цього синтаксису для наочності? (Зверніть увагу на подвійні дужки)
void func();
using FunctionPtr = decltype((func));
Інший підхід може використовувати тип автоматичного повернення із заднім типом повернення.
using FunctionPtr = auto (*)(int*) -> void;
Це має суперечливу перевагу в тому, що можна сказати щось - це функція ptr, коли псевдонім починається з "auto (*)", і він не переплутаний іменами ідентифікатора.
Порівняйте
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
з
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Відмова: Я взяв це з бесіди Біна Діна "Полегшення в сучасний C ++"
using
Насправді дуже конфіденційним , особливо тому, що ідентифікатори вказівників функції зазвичай розташовуються посерединіtypedef
оператора і рухаються на фронт, використовуючиusing
. Принаймні, там я загубився.