当前位置: 首页 > 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;}

相关文章:

  • Linux-07 ubuntu 的 chrome 启动不了
  • 【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)
  • 总结vxe-grid的一些用法
  • 前端vue打开多个窗口,关闭窗口后才继续执行后续逻辑
  • 【C语言】字符与字符串
  • [6-01-01].第12节:字节码文件内容 - 属性表集合
  • Pydantic,Field和Annotated
  • JAVA实战开源项目:周边游平台系统 (Vue+SpringBoot) 附源码
  • Python图像灰度化处理:原理、方法与实战
  • Java八股文——集合「Queue篇」
  • Redis Set集合命令、内部编码及应用场景(详细)
  • 【电赛培训课程】运算放大器及其应用电路设计
  • Abaqus分析步与输出:
  • JVM中的各类引用
  • Redis(02)Win系统如何将Redis配置为开机自启的服务
  • Linux下如何使用shell脚本导出elasticsearch中某一个index的数据为本地csv文件
  • mysql脚本安装
  • 【设计模式-4.11】行为型——解释器模式
  • 【element-ui】el-autocomplete实现 无数据匹配
  • win10系统docker安装dify
  • access是不是常用的网页制作工具/如何做网站推广优化
  • 网站首页地址是什么/html友情链接
  • 临朐网站建设咨询/宁波网站推广方式
  • 大学生网页设计作品/班级优化大师网页版登录
  • 京东物流网站建设特点/企业如何网络推广
  • 网站设计指南/模板建站常规流程