Как я могу typedef указатель на функцию с C++11 с помощью синтаксиса?
Я хотел бы написать это
typedef void (*FunctionPtr)();
используя using
. Как бы я это сделал?
5 ответов:
"уродство" также может быть удалено, если вы избегаете ввода указателя:
void f() {} using Function_t = void(); Function_t* ptr = f; ptr();
вы хотите
type-id
, что по сути точно так же, как объявление, за исключением удаленияdeclarator-id
. Элементdeclarator-id
обычно идентификатор и имя, которые вы объявляете в декларации equivilant.например:
int x
The
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, когда псевдоним начинается с "auto (*)", и он не запутывается именами идентификаторов.
сравнить
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
С
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
отказ от ответственности: я взял это из разговора Бина Дина " ослабление в современный C++"