C++11, 14, 17对tuple元素的访问方式

本文探讨了C++中std::tuple的使用,从C++11的std::get获取元素引用,到C++14通过类型获取元素,再到C++17引入的结构化绑定增强表达力。通过一个Moo类的实例展示了不同版本下元组元素的访问方式,揭示了C++语言版本演进带来的便利性提升。
摘要由CSDN通过智能技术生成

std::tuple 作为可以存放任意个数,任意类型的元祖被我个人经常使用。记得以前看侯捷谈到这个数据结构的时候,被他的实现所惊奇,太巧妙地设计。我自己在使用std::tuple的时候也随着C++版本的更新尝试新的写法,对于元组中元素的获取,我一直觉得很有意思:
比如我有这么一个源文件:

#include <iostream>
#include <tuple>

#define CPP11 (__cplusplus < 201401L)
#define CPP14 (__cplusplus < 201701L and __cplusplus > 201401L)
#define CPP17 (__cplusplus >= 201702L)

class Moo {
  Moo() { ::printf("%s\n", __PRETTY_FUNCTION__); }
  Moo(Moo const &) { ::printf("%s\n", __PRETTY_FUNCTION__); }
  Moo(Moo &&) { ::printf("%s\n", __PRETTY_FUNCTION__); }
  Moo &operator=(Moo const &) noexcept {
    ::printf("%s\n", __PRETTY_FUNCTION__);
    return *this;
  }

  Moo &operator=(Moo &&) noexcept {
    ::printf("%s\n", __PRETTY_FUNCTION__);
    return *this;
  }

  ~Moo() { ::printf("%s\n", __PRETTY_FUNCTION__); }
};

int main() {
  std::cout << "c++ version:" << __cplusplus << std::endl;
  auto &&tp = std::make_tuple<Moo, const char *, int>(Moo(), "hello world", 3);

#if CPP11
  auto &&first = std::get<0>(tp);
  auto &&second = std::get<1>(tp);
  auto &&third = std::get<2>(tp);
#endif

#if CPP14
  auto &&first = std::get<Moo>(tp);
  auto &&second = std::get<const char *>(tp);
  auto &&third = std::get<int>(tp);
#endif

#if CPP17
  auto [a, b, c] = tp;
  auto &[first, second, third] = tp;
#endif

  return 0;
}

Moo类考察当前对象在构造tuple和返回值的过程中经历怎样的人生
C++11: 使用std::get方法来获取对应秩的元素的引用
C++14: 使用类似在nlohmannjson里面获取对应类型的json对象的方式,通过类型来获取对应的元素的引用,有点现代C++那味儿了吼
C++17: 引入了结构化绑定,不实用引用的时候会返回新创建的临时对象,a, b, c是对临时对象的右值引用,而使用引用则是想std::get那样引用原本对象。C++17结构化绑定yyds!表达力比之前强太多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

歪锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值