我记得十年前,有一段使用c ++模板元编程的代码可以从数组名称推断出数组尺寸。
例如
int a[2][3][4][5][6];
cout << DimOfArray(a) << endl
输出:
5
但是我忘记了该代码的细节。我记得它使用了sizeof(a)/sizeof(a[0])
的技巧。有人知道怎么写吗?
答案 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;
}