c++ - constexpr 返回多维 C 样式数组的维度元组

标签 c++ arrays multidimensional-array

有没有办法扩展/修改/实现 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::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,如果您的函数没有给出数组类型,那么您将得到一个空元组。当然,如果您愿意,您可以在那里执行额外的检查。

关于c++ - constexpr 返回多维 C 样式数组的维度元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42602908/

相关文章:

c++ - 获取最接近键的 std::container::iterator

c++ - 如何在 Windows 7 64 位上设置 MinGw?

java - 非递减序列的最大和

java - Android:随机播放变量和多个 setText

Java 改变二维数组中的值

c++ - OpenACC - 私有(private)二维数组

c++ - 将函数指针存储为类中的成员

c++ - 如何将函数作为参数传递给transform()函数?

python - Python 中的 list(array) 和 array.tolist() 之间有什么区别吗?

c - 如何使用多维数组重新格式化 C 中的输出