关于std::tuple_size<std::array>
的辅助类std::array
,我有两个问题。
首先,在类size()
中有一个constexpr std::array
成员函数,为什么一个人需要std::tuple_size<std::array>
?
第二,tuple_size
这个名字是否具有误导性?
答案 0 :(得分:5)
std::tuple_size
(及其朋友std::tuple_element
和std::get
)的设计目标不仅是在文字std::tuple
上运行,而且要在类似元组的任何东西上运行。类似元组的东西通常仅表示它是包含固定数量的有序元素的复合类型。
例如,通过查看structured bindings的定义方式,您可以清楚地看到这种抽象的用法:它们允许分解具有std::tuple_size
,std::tuple_element
和{{ 1}}。
在这种扩展的“类似元组”的概念下,只有get<I>
(和std::array
)会将这些特征专门化为N个相同类型的元组(resa。a)才有意义。大小为2的元组。
答案 1 :(得分:3)
它是std::array
支持的元组接口的一部分。其他部分是std::tuple_element
和std::get
。
std::array::size
也是多余的,其大小被指定为类型的一部分。作为序列容器接口的一部分存在。
答案 2 :(得分:1)
std::tuple_size
和std::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::tuple
,std::pair
,std::array
以及为std::tuple_size
,{{1}提供专业化功能的任何其他用户类型一起使用},以及与类型相关的命名空间中的功能模板std::tuple_element
。
此外,当使用结构化绑定语法时,语言本身也会查找并使用get
,std::tuple_size
和std::tuple_element
。同样,它可以是任何相同的类型,包括实现接口的用户定义类型。
get