c++11元组std::tuple

元组,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;

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值