constexpr返回多维C风格数组的维度元组

时间:2017-03-05 00:13:17

标签: 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,如何使arrayize适用于任何维数组?上述“有效”但只返回一个维度:

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来处理任何维数组?尝试使用参数包,但没有成功。

1 个答案:

答案 0 :(得分: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,如果没有给出函数类型,则会留下空元组。当然,如果你愿意,你可以在那里进行额外的检查。