【发布时间】:2016-09-27 03:38:37
【问题描述】:
由于标题可能看起来很混乱,让我举个例子:
typedef bool foo[2];
typedef foo bar[4];
bar what_am_i;
那么,what_am_i 是我假设的 [4][2] 维数组,还是 [2][4] 维数组?
【问题讨论】:
标签: c++ c arrays multidimensional-array typedef
由于标题可能看起来很混乱,让我举个例子:
typedef bool foo[2];
typedef foo bar[4];
bar what_am_i;
那么,what_am_i 是我假设的 [4][2] 维数组,还是 [2][4] 维数组?
【问题讨论】:
标签: c++ c arrays multidimensional-array typedef
这是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
【讨论】:
foo 是一个包含2 元素类型为bool 的数组,即bool[2]。
bar 是一个包含foo 类型的4 元素的数组,即foo[4],每个元素都是一个bool[2]。
那么what_am_i 就是bool[4][2]。
【讨论】:
为了完成@Slardar Zhang 对 C 的 C++ 答案:
我是bool[4][2]。
您可以通过以下任一方式进行验证:
sizeof(what_am_i)/sizeof(*what_am_i) == 4sizeof(*what_am_i)/sizeof(**what_am_i) == 2【讨论】:
通过调试器检查变量后,我发现我是对的——what_am_i是一个[4][2]维数组。
【讨论】:
当你不知道变量的类型时,一个简单的方法就是这个技巧:
template<class T> struct tag_type{using type=T;};
template<class T> constexpr tag_type<T> tag{};
然后这样做:
tag_type<void> t = tag<some_type>;
几乎每个编译器都会吐出一个合理可读的“你不能将tag_type<full_unpacked_type> 分配给tag_type<void>”或类似的东西(假设你的类型不是void)。
你也可以用
来验证你的猜测是否正确tag_type<your_guess> t = tag<some_type>;
有时您会希望通过decltype(some_expression) 生成some_type。
【讨论】:
cout << typeid(what_am_i).name()——通过c++filt管道后,它会报告bool [4][2]。