`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_element
和 std::get
)的设计目标不仅是在文字 std::tuple
上工作,而且在任何 tuple-like. tuple-like 的东西通常只意味着它是一个包含固定数量的有序元素的复合类型。
您可以通过查看 structured bindings 的定义方式清楚地看到这种抽象的使用:它们允许分解任何具有 std::tuple_size
、std::tuple_element
和 std::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_size
和 std::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::tuple
、std::pair
、std::array
以及为 std::tuple_size
、[= 提供专业化的任何其他用户类型13=],以及与该类型相关的命名空间中的函数模板 get
。
此外,当使用结构化绑定语法时,语言本身会查找并使用 std::tuple_size
、std::tuple_element
和 get
。同样,这可以是任何相同类型,包括实现接口的 user-defined 类型。
using MyVec = std::array<double, 3>;
void f(const MyVec& v) {
const auto& [x, y, z] = v;
// ...
}
我有两个关于 std::array
的助手 class std::tuple_size<std::array>
的问题。
首先,classstd::array
中有一个constexprsize()
成员函数,为什么需要std::tuple_size<std::array>
?
其次,这个名字tuple_size
是否具有误导性?
std::tuple_size
(及其朋友 std::tuple_element
和 std::get
)的设计目标不仅是在文字 std::tuple
上工作,而且在任何 tuple-like. tuple-like 的东西通常只意味着它是一个包含固定数量的有序元素的复合类型。
您可以通过查看 structured bindings 的定义方式清楚地看到这种抽象的使用:它们允许分解任何具有 std::tuple_size
、std::tuple_element
和 std::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_size
和 std::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::tuple
、std::pair
、std::array
以及为 std::tuple_size
、[= 提供专业化的任何其他用户类型13=],以及与该类型相关的命名空间中的函数模板 get
。
此外,当使用结构化绑定语法时,语言本身会查找并使用 std::tuple_size
、std::tuple_element
和 get
。同样,这可以是任何相同类型,包括实现接口的 user-defined 类型。
using MyVec = std::array<double, 3>;
void f(const MyVec& v) {
const auto& [x, y, z] = v;
// ...
}