【问题标题】:constexpr to return tuple of dimensions of a multidimensional C-style arrayconstexpr 返回多维 C 样式数组的维度元组
【发布时间】:2017-03-05 00:13:17
【问题描述】:

有没有办法扩展/修改/实现 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,如何使数组大小适用于任意维数组?上面的“有效”但只返回一个维度:

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::array&lt;std::size_t, dimcount&gt;呢?

标签: c++ arrays multidimensional-array


【解决方案1】:

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,如果您的函数未指定数组类型,则为您留下一个空元组。当然,如果您愿意,您可以在那里进行额外的检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2014-07-02
    • 2014-07-23
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多