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

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.xdnf.cn/news/12094.html

相关文章:

  • [10-2]MPU6050简介 江协科技学习笔记(22个知识点)
  • MVCC机制:Undo Log版本链与ReadView机制
  • Python Excel 文件处理:openpyxl 与 pandas 库完全指南
  • 使用高斯朴素贝叶斯算法对鸢尾花数据集进行分类
  • 数据库优化实战分享:高频场景下的性能调优技巧与案例解析
  • 结构体指针与非指针 问题及解决
  • To be or Not to be, That‘s a Token——论文阅读笔记——Beyond the 80/20 Rule和R2R
  • centos升级内核
  • LuaJIT2.1 和 Lua5.4.8 性能对比
  • C++网络通信:TCP数据包的发送与接收编程
  • PyCharm中运行.py脚本程序
  • Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
  • 基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座
  • 猎板厚铜PCB工艺能力如何?
  • Web 架构相关文章目录(持续更新中)
  • Jenkins | Linux环境部署Jenkins与部署java项目
  • select、poll、epoll 与 Reactor 模式
  • 70年使用权的IntelliJ IDEA Ultimate安装教程
  • 代码中文抽取工具并替换工具(以ts为例)
  • 数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
  • DeepSeek-R1-0528-Qwen3-8B为底座微调领域大模型准备:制作领域专用数据集
  • HarmonyOS:Counter计数器组件
  • QQ邮箱发送验证码(Springboot)
  • AI系统负载均衡与动态路由
  • 力扣HOT100之二分查找: 34. 在排序数组中查找元素的第一个和最后一个位置
  • 数学建模-嘉陵江铊污染事件解题全过程文档及程序
  • 联软NSPM自动化策略管理 助力上交所加速国产化替代提升运维效率
  • matlab实现DBR激光器计算
  • 全维度测试通过!DolphinScheduler 3.2.0单节点部署与验证实录
  • cursor-free-vip使用