【问题标题】:Array size metafunction - is it in boost somewhere?数组大小元函数 - 它在某处提升吗?
【发布时间】:2012-01-05 16:04:44
【问题描述】:

我在blog 上找到了以下模板:

template <typename T, size_t N>
struct array_info<T[N]>
{
    typedef T type;
    enum { size = N };
};

它是sizeof(a) / sizeof(a[0]) 的优雅替代品。

获取数组大小的常用构造肯定应该在库中的某个位置。我不知道一个。谁能告诉我这个功能在某个地方的标准库和/或 Boost 中?最好是易于使用且轻便的形式。

【问题讨论】:

标签: c++ arrays templates boost sizeof


【解决方案1】:

我最终自己找到了答案 - boost::size():

#include <boost/range.hpp>

int array[10];
boost::size(array); // returns 10

【讨论】:

    【解决方案2】:

    在新的 C++ 标准中,标头中的 std::array 具有方法 size(),它返回一个 constexpr,因此在编译时可用。

    你应该可以做类似的事情

    std::array< YourType, N > arr;
    constexpr auto totalSize = arr.size() * sizeof( std::array< YourType, N >::value_type );
    

    希望这会有所帮助...

    【讨论】:

    • +1 确实:如果您想要“C++ 精神”中的解决方案,请使用std::array
    • 您的意思是std::array&lt;int, 5&gt; arr; constexpr auto sizeInBytes = sizeof(arr); // 20 吗?
    【解决方案3】:

    C++ 17 支持std::size()(在标头&lt;iterator&gt; 中定义)

    #include <iterator>
    
    int my_array[10];
    std::size(my_array);
    
    std::vector<int> my_vector(10);
    std::size(my_vector);
    

    【讨论】:

      【解决方案4】:

      如果可能的话,我也会推荐std::arrayboost::array。也就是说,您也可以使用boost::extent 获取数组大小,使用boost::remove_all_extents 获取实际类型。

      在 c++11 中,标准库中也提供了类型特征。

      编辑:如果您正在寻找对变量而不是类型进行操作的函数,请尝试以下操作

      template <typename T, std::size_t N>
      std::size_t array_count(const T(&) [N]) { return N; }
      

      http://ideone.com/IOdfp查看使用示例

      【讨论】:

      • boost::extent 似乎适用于类型,而不是对象。我需要一些适用于数组对象的东西,例如v in char *v[] = {/*...*/}
      【解决方案5】:

      您可能需要宏_countof。根据http://www.cplusplus.com/forum/beginner/54241/,它是&lt;cstdio&gt; 中的#defined。但我不确定它是否在 Visual C++ 之外可用。

      无论如何,创建一个头文件并将你的定义放在那里并不复杂。


      更新:
      _countof 是 Microsoft 特定的,但这里有关于其他编译器的讨论:Equivalents to MSVC's _countof in other compilers?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 2013-06-16
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        相关资源
        最近更新 更多