Как я могу typedef указатель на функцию с C++11 с помощью синтаксиса?


Я хотел бы написать это

typedef void (*FunctionPtr)();

используя using. Как бы я это сделал?

5 131

5 ответов:

Он имеет такой же синтаксис, за исключением удаления идентификатора из Указателя:

using FunctionPtr = void (*)();

здесь пример

Если вы хотите "убрать уродство", попробуйте то, что предложил Xeo:

#include <type_traits>

using FunctionPtr = std::add_pointer<void()>::type;

и вот еще демо.

"уродство" также может быть удалено, если вы избегаете ввода указателя:

void f() {}
using Function_t = void();    
Function_t* ptr = f;
ptr();

http://ideone.com/e1XuYc

вы хотите 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++"