Как я могу ввести указатель на функцию с синтаксисом С++ 11?

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

typedef void (*FunctionPtr)();

с помощью using. Как мне это сделать?

Ответ 1

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

using FunctionPtr = void (*)();

Вот Пример

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

#include <type_traits>

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

И вот еще одна демонстрация.

Ответ 2

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

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

http://ideone.com/e1XuYc

Ответ 3

Вам нужен 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], где будет отображаться идентификатор если строительство было [декларация]. Именованный тип тогда совпадает с типом гипотетический идентификатор.

Ответ 4

Как насчет этого синтаксиса для ясности? (Обратите внимание на двойную скобку)

void func();
using FunctionPtr = decltype((func));