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

时间:2019-05-17 10:27:09

标签: c++ stdarray

关于std::tuple_size<std::array>的辅助类std::array,我有两个问题。

首先,在类size()中有一个constexpr std::array成员函数,为什么一个人需要std::tuple_size<std::array>

第二,tuple_size这个名字是否具有误导性?

3 个答案:

答案 0 :(得分:5)

std::tuple_size(及其朋友std::tuple_elementstd::get)的设计目标不仅是在文字std::tuple上运行,而且要在类似元组的任何东西上运行。类似元组的东西通常仅表示它是包含固定数量的有序元素的复合类型。

例如,通过查看structured bindings的定义方式,您可以清楚地看到这种抽象的用法:它们允许分解具有std::tuple_sizestd::tuple_element和{{ 1}}。

在这种扩展的“类似元组”的概念下,只有get<I>(和std::array)会将这些特征专门化为N个相同类型的元组(resa。a)才有意义。大小为2的元组。

答案 1 :(得分:3)

它是std::array支持的元组接口的一部分。其他部分是std::tuple_elementstd::get

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

答案 2 :(得分:1)

std::tuple_sizestd::tuple_element以及称为get的功能模板为“具有恒定计数和类型的对象列表”提供了通用接口,可在模板编程中使用它而无需指定类型

#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,{{1}提供专业化功能的任何其他用户类型一起使用},以及与类型相关的命名空间中的功能模板std::tuple_element

此外,当使用结构化绑定语法时,语言本身也会查找并使用getstd::tuple_sizestd::tuple_element。同样,它可以是任何相同的类型,包括实现接口的用户定义类型。

get