由于标题可能看起来很混乱,让我举个例子:
typedef bool foo[2];
typedef foo bar[4];
bar what_am_i;
那么,what_am_i
是{I}假定的[4][2]
维数组,还是[2][4]
维数组?
答案 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_i
为bool[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)
。