使用可变参数模板函数的内置多维数组的大小

时间:2011-11-28 15:34:48

标签: c++ multidimensional-array c++11 variadic-templates built-in

在C ++ 11中,可以使用constexpr创建一个函数,该函数在编译时返回内置一维数组的大小(元素数)。示例如下:

template <typename T, std::size_t N>
constexpr std::size_t size(T (&array)[N])
{
     return N;
}

这是ARRAY_SIZE和类似宏imo的优秀替代品。

但是,这只会返回内置多维数组最重要维度的大小。

我使用以下函数来确定内置二维数组的大小:

template <typename T, std::size_t N, std::size_t N2>
constexpr std::size_t size(T (&array)[N][N2])
{
     return N * N2;
}

理想情况下,使用一个返回具有任意数量维度的内置数组大小的函数非常有用。我认为可变参数模板可能会有所帮助,但我无法看到解压缩模板参数的方法,因为只传递了一个参数。这样的功能可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:5)

#include <type_traits>
#include <cstdlib>

template <typename T>
constexpr size_t size(const T&) noexcept
{
    return sizeof(T)/sizeof(typename std::remove_all_extents<T>::type);
}

示例:

#include <cstdio>
int main()
{
    int a[3][4][7][12];
    char f[6];

    printf("%lu == %ld ?\n", size(a), 3*4*7*12);
    printf("%lu == %ld ?\n", size(f), 6);

    return 0;
}

答案 1 :(得分:3)

template<typename T> constexpr int size(T const&) { 
  return 1; 
}

template<typename T, int N> constexpr int size(T const (&a)[N]) { 
  return N * size(a[0]); 
}