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

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.lqws.cn/news/153451.html

相关文章:

  • HikariCP数据库连接池原理解析
  • 智能照明系统:具备认知能力的“光神经网络”
  • Python-内置函数
  • 【SSM】SpringBoot笔记2:整合Junit、MyBatis
  • 「Java教案」选择结构
  • 解决 Git 访问 GitHub 时的 SSL 错误
  • 软考 系统架构设计师系列知识点之杂项集萃(81)
  • 大陆4D毫米波雷达ARS548调试
  • 线程的基础知识
  • 基于eclipse进行Birt报表开发
  • MySQL间隙锁入手,拿下间隙锁面试与实操
  • python变量
  • Java-IO流之转换流详解
  • 基于51单片机的温控电机系统
  • Liunx进程替换
  • 面试心得 --- 车载诊断测试常见的一些面试问题
  • RAID磁盘阵列
  • 记一次spark在docker本地启动报错
  • 多模态大语言模型arxiv论文略读(109)
  • 「Java EE开发指南」如何使用MyEclipse在Web项目中用Web Fragments?
  • Python爬虫与Java爬虫深度对比:从原理到实战案例解析
  • thinkphp8.1 调用巨量广告API接口,刷新token
  • 二叉树-104.二叉树的最大深度-力扣(LeetCode)
  • 深入解析与解决方案:处理Elasticsearch中all found copies are either stale or corrupt未分配分片问题
  • RunnablePassthrough介绍和透传参数实战
  • Python训练营---Day45
  • 泊松融合的介绍和OpenCV教程
  • Android7 Input(十)View 处理Input事件pipeline
  • 视频汇聚平台EasyCVR“明厨亮灶”方案筑牢旅游景区餐饮安全品质防线
  • ubuntu屏幕复制