如何使用"using"关键字定义函数prototype/signature

How to use the "using" keyword to define a function prototype/signature

在我努力移植我的 C++ 代码以更好地(和更一致地)使用 "Modern C++," 的过程中,我最新一轮的更改涉及将 typedef int32_t I2Arr[2] 别名替换为更现代的 using I2Arr = int32_t[2] 样式.这适用于 'simple'(标量)类型,对于定义函数指针特别有用

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

看起来比

更清晰(恕我直言)
typedef int32_t(IFunc*)(int32_t, int32_t);

但是,我对替换 typedef 实际函数原型(而不是指向函数的指针)感到有些困惑。例如,我有以下代码,使用 'old-style':

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

现在,也许(可能)我在这里真的很昏暗,但我只是想不出一种方法将其转换为 using 风格的别名。谁能告诉我怎么做?

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

就是这样,真的。

这与 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-specifier 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 *);

也就是说,它可以相对于其他声明说明符以任何顺序放置。:)

并且因为别名声明和 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];