typedef数组的typedef

时间:2016-05-29 05:21:42

标签: c++ c arrays multidimensional-array typedef

由于标题可能看起来很混乱,让我举个例子:

typedef bool foo[2];
typedef foo bar[4];
bar what_am_i;

那么,what_am_i是{I}假定的[4][2]维数组,还是[2][4]维数组?

5 个答案:

答案 0 :(得分:21)

bool[4][2] 您可以通过static_assert验证它:

static_assert(std::is_same<decltype(what_am_i), bool[4][2]>::value, "");
static_assert(std::is_same<decltype(what_am_i), bool[2][4]>::value, ""); // failed

答案 1 :(得分:13)

foo是一个包含2类型bool元素的数组,即bool[2]

bar是一个包含 4 类型foo元素的数组,即foo[4],每个元素都是bool[2]

然后what_am_ibool[4][2]

答案 2 :(得分:6)

为了完成@Slardar Zhang的C ++答案C:

它是sizeof(*what_am_i)/sizeof(**what_am_i) == 2

您可以通过以下任一方式验证它:

  • imageRef.src = preloadImages[Id].src;
  • DBSIZE

答案 3 :(得分:3)

通过调试器检查变量后,我发现我是对的 - what_am_i是一个[4][2]维数组。

答案 4 :(得分:1)

当你不知道变量的类型时,其中一个简单的方法是:

 template<class T> struct tag_type{using type=T;};
 template<class T> constexpr tag_type<T> tag{};

然后这样做:

 tag_type<void> t = tag<some_type>;

几乎每个编译器都会吐出一个相当可读的#34;你不能将tag_type<full_unpacked_type>分配给tag_type<void>&#34;或某些(假设你的类型不是void)。

您还可以使用

验证您的猜测是否正确
tag_type<your_guess> t = tag<some_type>;

有时您希望通过some_type生成decltype(some_expression)