元组,c++11中引入的新的类型,可类比std::pair。 tuple是一个固定大小的不同类型值的集合,是泛化的std::pair,但是std::pair只能支持两个元素。 理论上, 元组支持0~任意个元素。 头文件#include<tuple>
1.tuple创建初始化
tuple<T1, T2& ,Object> t;
2.tuple元素操作
获取元素个数
tuple_size<decltype(t)>::value;
获取元素的值--get
get<lth>(object);--lth哪个位置,object是tuple对象
获取元素类型
#include <tuple>
#include<type_traits>
#include<iostream>
#include<string>
#include<functional>
#include<tuple>
using namespace std;
class Object{
public:
int num;
string id;
public:
Object(){}
Object(int n, const string s) : num(n), id(s){ cout << "N,S" <<endl ;}
void func(){
cout << num << " - "<< id << endl;
}
};
int main(){
//std::apply可以解决函数调用时,tuple转参数列表,但是如果希望调用的是构造函数怎么办?
//构造函数毕竟没办法直接获取函数指针。
std::tuple<int, string,Object> t = {1, "hua",{1, "r"}};
std::make_tuple(1, "jojo");
int i = 1;
string str = "gold";
tuple<int &, string &> t2(ref(i), ref(str));
cout << tuple_size<decltype(t)>::value <<endl;
cout << get<0>(t) <<endl;
cout << get<1>(t) <<endl;
cout << get<2>(t).id <<endl;
tuple_element<0, decltype(t)>::type id;
cout << typeid(id).name() <<endl;
//Object && a = make_from_tuple<Object>(move(t));
//t.func();
return 0;
}
输出结果
3.tie进行解包元素的值
元组,可以看作一个包,类比结构体。 需要访问元组的元素时,2 种方法: A、索引访问,B、std::tie 。
元组包含一个或者多个元素,使用std::tie解包: 首先需要定义对应元素的变量,再使用tie。 比如,元素第0个元素的类型时 char, 第1个元素类型时int, 那么, 需要定义 一个 char的变量和int的变量, 用来储存解包元素的结果。
tuple<int, double ,string> tup(9, 9.9, "999 cold");
// 定义变量,保存解包结果
int num = 0;
double d_num = 0.0;
string sstr("123");
// 使用std::tie, 依次传入对应的解包变量
std::tie(num,d_num,sstr) = tup;
cout << "num " << num << endl;
cout << "d_num " << d_num <<endl;
cout << "sstr " << sstr << endl;
4.元组连接(tuple_cat)
tuple<int, double ,string> tup(9, 9.9, "999 cold");
// 组合到一起, 使用auto, 自动推导
auto ttu = tuple_cat(tup,make_tuple(20));
cout <<"medicine num -- " << get<0>(ttu) <<endl;
cout << "discount -- " << get<1>(ttu) <<endl;
cout <<"medicine name -- " << get<2>(ttu) <<endl;
cout << " money -- " << get<3>(ttu) <<endl;