【问题标题】:typedef of array of typedefs of array数组的 typedef 数组的 typedef
【发布时间】: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


    【解决方案1】:

    这是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
    

    【讨论】:

      【解决方案2】:

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

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

      那么what_am_i 就是bool[4][2]

      【讨论】:

        【解决方案3】:

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

        我是bool[4][2]

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

        • sizeof(what_am_i)/sizeof(*what_am_i) == 4
        • sizeof(*what_am_i)/sizeof(**what_am_i) == 2

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            当你不知道变量的类型时,一个简单的方法就是这个技巧:

             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&lt;full_unpacked_type&gt; 分配给tag_type&lt;void&gt;”或类似的东西(假设你的类型不是void)。

            你也可以用

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

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

            【讨论】:

            • 或者你可以cout &lt;&lt; typeid(what_am_i).name()——通过c++filt管道后,它会报告bool [4][2]
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-15
            • 2013-07-20
            相关资源
            最近更新 更多