通过C ++模板元编程从数组名称推断数组维数

时间:2018-08-21 05:52:57

标签: c++ template-meta-programming

我记得十年前,有一段使用c ++模板元编程的代码可以从数组名称推断出数组尺寸。

例如

int a[2][3][4][5][6];
cout << DimOfArray(a) << endl

输出:

5

但是我忘记了该代码的细节。我记得它使用了sizeof(a)/sizeof(a[0])的技巧。有人知道怎么写吗?

2 个答案:

答案 0 :(得分:5)

原始代码可能已经建立了std::rank提供的功能,请参见“可能的实现”部分;因为不必继承整数常量(那时候不存在),可以将其修改为:

template<typename T>
struct rank { static size_t const value = 0U; };

template<typename T>
struct rank<T[]> { static size_t const value = rank<T>::value + 1; };

template<class T, std::size_t N>
struct rank<T[N]> { static size_t const value = rank<T>::value + 1; };

然后代码将在模板函数中使用此模板类(模板类可能在该函数中也为本地类):

template <typename T>
size_t dimOfArray(T const& array)
{
    return /*std::*/rank<T>::value;
}

使用现代C ++最好声明此功能constexpr。如果只是想获得一个特定尺寸的大小,则可以使用以下方法:

template <typename T, size_t N>
size_t dimOfArray(T const (&array)[N]) constexpr
{
    return N;
}

再次,今天您可能想拥有constexpr(如图所示)。

后者(特定尺寸的大小)也是sizeof(a)/sizeof(*a)“技巧”可以实现的(而不是N的返回更加简单),但是我看不到,您将如何获取尺寸数量。

答案 1 :(得分:1)

自C ++ 11起,您有了std::rank,所以这个小包装程序可以满足您的要求:

#include <type_traits>

template <typename T>
size_t DimOfArray(T const& array) constexpr
{
    return std::rank<T>::value;
}