对于一维情况,您可以使用std::tuple_size
其定义为std::array
还有:
int main()
{
std::cout << std::tuple_size<array3D<float, 3, 4, 5>>();
}
针对你的实际问题。如果我理解正确的话,您希望在尺寸函数上有一个附加参数,您可以使用它来选择应返回尺寸的尺寸,对吧?
这可以通过使用递归轻松完成。这是一个工作示例:
// Example program
#include <iostream>
#include <string>
#include <array>
// typedefs for certain container classes
template<class T, size_t x>
using array1D = std::array<T, x>;
template<class T, size_t x, size_t y>
using array2D = std::array<std::array<T, y>, x>;
template<class T, size_t x, size_t y, size_t z>
using array3D = std::array<std::array<std::array<T, z>, y>, x>;
template <size_t dim, typename Array>
struct size_of_dim;
// specialization for std array and first dimension
template <typename T, size_t N>
struct size_of_dim<0, std::array<T,N>> : std::integral_constant<size_t, N> {};
// specialization for std array and dimension > 0 → recurse down in dim
template <size_t dim, typename InnerArray, size_t N>
struct size_of_dim<dim, std::array<InnerArray,N>> : size_of_dim<dim-1,InnerArray> {};
int main()
{
std::cout << size_of_dim<0,array3D<float, 3, 4, 5>>() << std::endl;
std::cout << size_of_dim<1,array3D<float, 3, 4, 5>>() << std::endl;
std::cout << size_of_dim<2,array3D<float, 3, 4, 5>>() << std::endl;
}
DEMO https://wandbox.org/permlink/0z8g3ccE8ac6uwOw