我在blog上找到了以下模板:
template <typename T, size_t N>
struct array_info<T[N]>
{
typedef T type;
enum { size = N };
};
它是sizeof(a) / sizeof(a[0])
的优雅替代品。
获取数组大小的常用构造肯定应该在库中的某个位置。我不知道一个。任何人都可以告诉我这个功能是在某个地方和/或Boost的标准库中吗?优选地,以易于使用和轻质的形式。
我最终找到了自己的答案 - boost::size()
:
#include <boost/range.hpp>
int array[10];
boost::size(array); // returns 10
在新的C ++标准中,头文件中的std :: array具有方法size(),它返回constexpr,因此在编译时可用。
你应该能够做类似的事情
std::array< YourType, N > arr;
constexpr auto totalSize = arr.size() * sizeof( std::array< YourType, N >::value_type );
希望这可以帮助...
如果可能的话,如果可能的话,我也会推荐std::array
或boost::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上的使用示例
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);
你可能需要宏_countof
。据http://www.cplusplus.com/forum/beginner/54241/说,它是在<cstdio>
中的#defined。但我不确定它是否可以在Visual C ++之外使用。
无论如何,创建一个头文件并将你的定义放在那里并不复杂。
更新:
_countof
是微软特有的,但这里有关于其他编译器的讨论:Equivalents to MSVC's _countof in other compilers?