如何使用typedef来别名c++数组

How to use typedef to alias C++ arrays?

本文关键字:c++ 数组 别名 何使用 typedef      更新时间:2023-10-16

当对数组使用typedef时,它被用作

typedef int Color[3];

这对我来说是非常违反直觉的。

为什么不选择typedef int[3] Color[3]?

typedef看起来完全像一个普通的变量声明,而这恰好是C中的数组声明的样子(并继承到c++中):

int foo[3]; // Array of three int
typedef int FooT[3]; // typedef for array of three int.

Typedef就像变量定义一样工作,遵循所有相同的规则(已经建立和已知的规则),唯一的区别是它表示的不是变量名,而是类型。

我想说,与其实现一些新的方案(这将不得不处理所有微妙的事情,例如,指针指向数组与指针数组),不如使用现有的方案是明智的选择。

恐怕这就是语言的定义方式。如果有帮助的话,typedef语法看起来就像声明语法:

int Color[3];

将生成一个包含三个整数的数组,因此:

typedef int Color[3];

Typedefs一个由三个整数组成的数组

语法匹配的一个方便的优点是,您可以使用cdecl(1)之类的工具为您生成或解释它们:
cdecl> explain int Color[3]
declare Color as array 3 of int
cdecl> declare Color as array 3 of int
int Color[3]

我建议使用

typedef std::array<int,3> RGB_Type;

与其他c++ std容器的类型定义一致。

在c++ 11中,你可以创建一个接近你想要的语法:

template<typename T>
using type_def = T;
type_def<int[3]> colors;

乍一看,我不建议这样做:另一方面,一些非常复杂的类型声明可以通过这种机制大大简化。去除复杂类型中的"占位符" typedef,其目的只是为了使最终类型看起来更具可读性。