有没有办法扩展/修改/实现 constexpr 以返回多维 C 样式数组的维度的 std::tuple?
#include <iostream>
#include <tuple>
template<typename T, std::size_t N>
auto arraysize(T (&arr)[N])
{
return std::make_tuple(N);
}
IOW,如何使 arraysize 适用于任意维数组?上面的“有效”,但只返回一个维度:
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 来处理任意维数组?尝试使用参数包但不成功。
最佳答案
使用std::rank
和 std::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,如果您的函数没有给出数组类型,那么您将得到一个空元组。当然,如果您愿意,您可以在那里执行额外的检查。
关于c++ - constexpr 返回多维 C 样式数组的维度元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42602908/