「这是我参与11月更文挑战的第 10 天,活动详情查看:2021最后一次更文挑战」。
参加该活动的第 23 篇文章
前置知识
tuple 和 vector 比较
vector 只能存储同一种类型的数据,tuple 可以存储任意类型的数据;
vector 和 variant 比较
二者都可以存储不同类型的数据,但是 variant 的类型个数是固定的,而 tuple 的类型个数不是固定的,是变长的,更为强大
std::decay
类模板说明
为类型 T 应用从左值到右值(lvalue-to-rvalue) 、数组到指针(array-to-pointer) 和函数到指针(function-to-pointer) 的隐式转换。
转换将移除类型 T 的 cv 限定符(const 和 volatile 限定符),并定义结果类型为成员 decay<T>::type
的类型。这种转换很类似于当函数的所有参数按值传递时发生转换。
- 如果类型 T 是一个函数类型,那么从函数到指针的类型转换将被应用,并且 T 的衰变类型等同于:
add_pointer<T>::type
- 如果类型 T 是一个数组类型,那么从数组到指针的类型转换将被应用,并且 T 的衰变类型等同于:
add_pointer<remove_extent<remove_reference<T>::type>::type>::type
- 当左值到右值转换被应用时,T 的衰变类型等同于:
remove_cv<remove_reference<T>::type>::type
模板参数说明
T 表示某种类型。
- 当 T 是引用类型,
decay<T>::type
返回 T 引用的元素类型; - 当 T 是非引用类型,
decay<T>::type
返回 T 的类型
正文
前文介绍过 C++11 / C++14 中 tuple 的基本使用,接下来将介绍 tuple 的一些高级用法
获取 tuple 中某个位置元素的类型
其中我们通过 std::tuple_element
来获取 tuple 元素的类型。
然后第几个元素就从 tuple std::get
第几个元素出来。
1 | cpp复制代码template <typename Tuple> |
获取 tuple 的元素个数
1 | cpp复制代码tuple t; |
遍历 tuple 中的每个元素
因为 tuple 的参数是变长的,而且类型也可能不同,并没有 for_each
函数,如果我们想遍历 tuple 中的每个元素,需要自己写代码实现。
举例,要打印 tuple
中的每个元素的话,代码如下
1 | cpp复制代码template <class Tuple, std::size_t N> |
根据 tuple 元素值获取其对应的索引
1 | cpp复制代码namespace detail ///< 命名空间 |
展开 tuple,并将其元素作为函数的参数
这样就可以用统一的形式来调用任意的函数及其参数,我们还能根据需要对 tuple 元素进行单独处理
1 | cpp复制代码#include <tuple> |
本文转载自: 掘金