`std::tuple_size<std::array>` 的目的是什么

What is the purpose of `std::tuple_size<std::array>`

我有两个关于 std::array 的助手 class std::tuple_size<std::array> 的问题。

首先,classstd::array中有一个constexprsize()成员函数,为什么需要std::tuple_size<std::array>

其次,这个名字tuple_size是否具有误导性?

std::tuple_size(及其朋友 std::tuple_elementstd::get)的设计目标不仅是在文字 std::tuple 上工作,而且在任何 tuple-like. tuple-like 的东西通常只意味着它是一个包含固定数量的有序元素的复合类型。

您可以通过查看 structured bindings 的定义方式清楚地看到这种抽象的使用:它们允许分解任何具有 std::tuple_sizestd::tuple_elementstd::tuple_element 的合理实现的东西get<I>.

在 "tuple-like" 这个扩展的概念下,只有 std::array(和 std::pair)将这些特征专门化为 N 个相同类型的元组(resp . 一个大小为 2 的元组)。

它是元组接口的一部分,std::array 支持。其他部分是std::tuple_element and std::get.

std::array::size也是多余的,大小被指定为类型的一部分。它作为序列容器接口的一部分存在。

std::tuple_sizestd::tuple_element 以及名为 get 的函数模板为 "list of objects with constant count and types" 提供了一个通用接口,可用于模板编程而无需指定类型。

#include <utility>

template <class Tuple>
constexpr std::tuple_element_t<Tuple>& get_last(Tuple& t) {
    constexpr auto size = std::tuple_size<Tuple>::value;
    static_assert(size > 0);
    return get<size-1>(t);
}

get_last 函数将适用于 std::tuplestd::pairstd::array 以及为 std::tuple_size、[= 提供专业化的任何其他用户类型13=],以及与该类型相关的命名空间中的函数模板 get

此外,当使用结构化绑定语法时,语言本身会查找并使用 std::tuple_sizestd::tuple_elementget。同样,这可以是任何相同类型,包括实现接口的 user-defined 类型。

using MyVec = std::array<double, 3>;
void f(const MyVec& v) {
    const auto& [x, y, z] = v;
    // ...
}