数组大小元函数 - 是否在某处提升?

时间:2011-11-24 13:30:00

标签: c++ arrays templates boost sizeof

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

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

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

用于获取数组大小的常用构造肯定应该在库中的某个位置。我不知道一个。任何人都可以告诉我这个功能是在某个地方和/或Boost的标准库中吗?优选地,以易于使用和轻量的形式。

5 个答案:

答案 0 :(得分:26)

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

#include <boost/range.hpp>

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

答案 1 :(得分:5)

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

你应该能够像

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

希望这会有所帮助......

答案 2 :(得分:1)

如果可能,如果可能,我还会推荐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

中的使用示例

答案 3 :(得分:1)

C ++ 17支持std::size()(在标题<iterator>中定义)

#include <iterator>

int my_array[10];
std::size(my_array);

std::vector<int> my_vector(10);
std::size(my_vector);

答案 4 :(得分:-1)

您可能需要宏_countof。根据{{​​3}},它是<cstdio>中的#defined。但我不确定它是否可以在Visual C ++之外使用。

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


更新:
_countof是特定于Microsoft的,但此处有关于其他编译器的讨论:http://www.cplusplus.com/forum/beginner/54241/