Как использовать ключевое слово «using» для определения прототипа / сигнатуры функции - PullRequest
2 голосов
/ 15 октября 2019

В моих усилиях по переносу моего кода C ++ для лучшего (и более последовательного) использования "Modern C ++" мой последний раунд изменений включает замену typedef int32_t I2Arr[2] псевдонимами на более современный стиль using I2Arr = int32_t[2]. Это прекрасно работает для «простых» (скалярных) типов и особенно полезно для определения указателей функций:

using IFunc = int32_t(*)(int32_t, int32_t);

выглядит намного яснее (ИМХО), чем:

typedef int32_t(IFunc*)(int32_t, int32_t);

Однако я просто немного застрял с заменой typedef на фактический прототип функции (а не на указатель на функцию). Например, у меня есть следующий код, использующий «старый стиль»:

typedef int32_t MaskMaker(int32_t, const uint8_t *, uint8_t *);
static MaskMaker *maskMakers[maskNum];

Теперь, может быть (возможно), я здесь действительно неясен, но я просто не могу найти способчтобы преобразовать это в псевдоним using. Может кто-нибудь показать мне, как это сделать?

Ответы [ 2 ]

7 голосов
/ 15 октября 2019
using MaskMaker = int32_t(int32_t, const uint8_t *, uint8_t *);

Вот и все.

3 голосов
/ 15 октября 2019

Это тот же подход, что и для объявления typedef.

using MaskMaker  = int32_t( int32_t, int32_t );
static MaskMaker *maskMakers[maskNum];

Так что, если у вас есть такое объявление

typedef int32_t MaskMaker(int32_t, const uint8_t *, uint8_t *);

, просто переместите имя MaskMaker вслева от объявления псевдонима и удалите спецификатор decl typedef ..

typedef int32_t MaskMaker(int32_t, const uint8_t *, uint8_t *);
using MaskMaker = int32_t (int32_t, const uint8_t *, uint8_t *);

Кстати обратите внимание на то, что объявление typedef может выглядеть также как

int32_t typedef MaskMaker(int32_t, const uint8_t *, uint8_t *);

, то есть ономожет быть размещен в любом порядке относительно других decl-specifiers. :)

И поскольку объявления alias-декларации и typedef являются декларациями, они могут присутствовать вместе. Например

int32_t typedef MaskMaker(int32_t, const uint8_t *, uint8_t *);
using MaskMaker = int32_t (int32_t, const uint8_t *, uint8_t *);
static MaskMaker *maskMakers[maskNum];
...