当前位置: 首页 > article >正文

std::conditional_t一个用法

例子摘自:

《mastering-the-c17-stl-make-full-use-of-the-standard-library-components-in-c17.pdf》 

struct list_node {int data;list_node *next;
};template<bool Const>
struct list_of_ints_iterator {friend class list_of_ints;friend class list_of_ints_iterator<!Const>;//Const为true的时候,编译成const list_node*,为false的时候,为list_node*using node_pointer = std::conditional_t<Const, const list_node*,list_node*>;using reference = std::conditional_t<Const, const int&, int&>;node_pointer ptr_;explicit list_of_ints_iterator(node_pointer p) : ptr_(p) {}public:reference operator*() const { return ptr_->data; }auto& operator++() { ptr_ = ptr_->next; return *this; }auto operator++(int) { auto result = *this; ++*this; return result; }// Support comparison between iterator and const_iterator typestemplate<bool R>bool operator==(const list_of_ints_iterator<R>& rhs) const{return ptr_ == rhs.ptr_;}template<bool R>bool operator!=(const list_of_ints_iterator<R>& rhs) const{return ptr_ != rhs.ptr_;}// Support implicit conversion of iterator to const_iterator// (but not vice versa)operator list_of_ints_iterator<true>() const{return list_of_ints_iterator<true>{ptr_};}
};struct list_of_ints {list_of_ints(list_node* phead, list_node* ptail){head_ = phead;tail_ = ptail;}list_node *head_ = nullptr;list_node *tail_ = nullptr;// ...
public://Iterators and Rangesusing const_iterator = list_of_ints_iterator<true>;using iterator = list_of_ints_iterator<false>;iterator begin() { return iterator{ head_ }; }iterator end() { return iterator{ nullptr }; }const_iterator begin() const { return const_iterator{ head_ }; }const_iterator end() const { return const_iterator{ nullptr }; }
};template<typename type>
struct TypePrint;int main(int, char**){    list_node node5{ 5, NULL };list_node node4{ 4, &node5 };list_node node3{ 3, &node4 };list_node node2{ 2, &node3 };list_node node1{ 1, &node2 };list_of_ints list{ &node1, &node5 };for (list_of_ints_iterator<false> it=list.begin(); it!=list.end();++it){//编译时会给出提示信息,打印it的类型。是list_of_ints_iterator<false>//TypePrint<decltype(it)> x;  std::cout << *it << std::endl;}for (auto it : list){//编译时会给出提示信息,打印it的类型。是int//TypePrint<decltype(it)> x;  std::cout << it << std::endl;}return 0;}

http://www.lryc.cn/news/2401938.html

相关文章:

  • Java高效批量读取Redis数据:原理、方案与实战案例
  • 基于RK3568的多网多串电力能源1U机箱解决方案,支持B码,4G等
  • 面试题:Java多线程并发
  • 2006-2020年各省用水总量数据
  • 舵机在弹簧刀无人机中的作用是什么?
  • c++ openssl 使用 DES(数据加密标准)进行加密和解密的基本操作
  • Git忽略规则.gitignore不生效解决
  • Excel高级函数使用FILTER、UNIQUE、INDEX
  • 6月5日day45
  • Linux 系统 rsyslog 配置
  • 基于rpc框架Dubbo实现的微服务转发实战
  • matlab基于GUI实现水果识别
  • 视频爬虫的Python库
  • 深度学习N2周:构建词典
  • Qt多线程访问同一个数据库源码分享(基于Sqlite实现)
  • 多类别分类中的宏平均和加权平均
  • 电子电路:什么是扩散电容?
  • 贪心算法应用:装箱问题(FFD问题)详解
  • 机器学习的数学基础:假设检验
  • 余氯传感器在智慧水务系统中如何实现IoT集成
  • 操作系统学习(九)——存储系统
  • 服务器安装软件失败或缺依赖怎么办?
  • linux nm/objdump/readelf/addr2line命令详解
  • 006网上订餐系统技术解析:打造高效便捷的餐饮服务平台
  • [10-2]MPU6050简介 江协科技学习笔记(22个知识点)
  • 基于行为分析的下一代安全防御指南
  • Redis持久化机制详解:RDB与AOF的深度剖析
  • 记录一次 apt-key curl导入失败的处理方式
  • Spring Boot 3.X 下Redis缓存的尝试(二):自动注解实现自动化缓存操作
  • 【03】完整开发腾讯云播放器SDK的UniApp官方UTS插件——优雅草上架插件市场-卓伊凡