Ответы:
Он имеет аналогичный синтаксис, за исключением того, что вы удалите идентификатор из указателя:
using FunctionPtr = void (*)();
Вот пример
Если вы хотите «убрать безобразие», попробуйте то, что предложил Ксео:
#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();
*
позже и получу запутанные ошибки.
Вы хотите a 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 (*)()
Это работает, потому что, учитывая, type-id
вы всегда можете однозначно определить, куда будет идти идентификатор для создания объявления. С 8.1.1 в стандарте:
Можно однозначно определить местоположение в [type-id], где идентификатор появился бы, если бы конструкция была [декларацией]. Именованный тип тогда совпадает с типом гипотетического идентификатора.
Как насчет этого синтаксиса для ясности? (Обратите внимание на двойные скобки)
void func();
using FunctionPtr = decltype((func));
Другой подход может использовать автоматический тип возврата с конечным типом возврата.
using FunctionPtr = auto (*)(int*) -> void;
Это имеет спорное преимущество быть в состоянии сказать, что что-то функция PTR, когда псевдоним начинается с «авто (*)», и это не запутывается именами идентификаторов.
сравнить
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
с участием
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Отказ от ответственности: я взял это из беседы Бина Дина "Легкость в современном C ++"
using
действительно очень даже, особенно потому, что идентификаторы указателей на функции обычно находятся в серединеtypedef
оператора и перемещаются впередusing
. По крайней мере, там я потерян.