2017-03-05 64 views
2

有没有扩展/修改/实现constexpr以返回多维C风格数组维度的std ::元组的方法?constexpr返回多维C风格数组的维数

#include <iostream> 
#include <tuple> 
template<typename T, std::size_t N> 
auto arraysize(T (&arr)[N]) 
{ 
    return std::make_tuple(N); 
} 

IOW,如何使数组大小适用于任何维数组?上述的 “作品”,但只返回一个维度:

int i[5]; 
std::cout << std::get<0>(arraysize(i)) << std::endl; 

作品,并返回5。而且,

char c[3][4]; 
std::cout << std::get<0>(arraysize(c)) << std::endl; 

作品,并返回3,但

std::cout << std::get<1>(arraysize(c)) << std::endl; 

不编译是因为arraysize()没有正确编码。有没有办法将它编码为一个constexpr来处理任何维数组?尝试使用参数包,但没有成功。

+0

为什么不用'std :: array '来返回? – user2079303

回答

5

使用std::rankstd::extent与索引顺序绝招:live example

#include <tuple> 
#include <type_traits> 
#include <utility> 

template<typename Arr, std::size_t... Is> 
constexpr auto extents_impl(const Arr&, std::index_sequence<Is...>) { 
    return std::make_tuple(std::extent_v<Arr, Is>...); 
} 

template<typename Arr> 
constexpr auto extents(const Arr& arr) { 
    return extents_impl(arr, std::make_index_sequence<std::rank_v<Arr>>{}); 
} 

这些特性也非数组类型或绑定未知的数组返回0,你留下一个空的元组,如果你的函数是没有给出数组类型。如果您愿意,您当然可以在那里进行额外的检查。