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

c++ decltype关键字

decltype为类型推导关键字。 示例代码:

// decltype也可用于函数模板编程:
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {return t + u;
}// decltype推导函数返回类型
auto doubleNumFunc(int x) -> decltype(x * 2) {return x * 2;
};// 测试decltype关键字的各种用法
void testDecltype() {// 基本用法int x;decltype(x) y = 10;auto& typeInfoY = typeid(y);cout << "type y: " << typeInfoY.name() << endl;// 推导表达式类型struct MyStruct{size_t sum(size_t a, size_t b) {cout << a << " + " << b << " = " << (a + b) << endl;return a + b;}};MyStruct myStruct;decltype(myStruct.sum(1, 2) / 0) z; // 这里直接推导类型,不会调用函数,也不会计算值,所以除0也不报错。auto& typeInfoZ = typeid(z);cout << "type z: " << typeInfoZ.name() << endl;// 引用类型的推导unsigned m = 0;unsigned& n = m;decltype(n) a = m; // 因为a是引用类型,所以这里必须赋值,否则报错:引用变量a需要初始值设定项auto& typeInfoA = typeid(a);cout << "type a: " << typeInfoA.name() << endl;// 调用模板函数auto b = add(1, 2.5);auto& typeInfoB = typeid(b);cout << "type b: " << typeInfoB.name() << endl;auto c = doubleNumFunc(1);auto& typeInfoC = typeid(c);cout << "type c: " << typeInfoC.name() << endl;
}

打印:

ok.  意犹未尽,再结合类模板测试下。代码如下:

template <typename T> // T为容器类
class TestDecltype {
public:auto getIterator(T& container) -> decltype(container.begin()) {if (iterator == decltype(iterator)()) { // 迭代器与默认构造迭代器比较,而不能直接与nullptr比较或赋值(!iterator 这样编译不过)iterator = container.begin();}return iterator;}TestDecltype():iterator(){}
private:decltype(T().begin()) iterator; // 这里推导了迭代器的类型,这里是默认构造,没有真正关联到具体容器数据呢。
};void testDecltype2() {vector<int> vec{9, 5, 2, 7};TestDecltype<vector<int>> demo;for (auto it = demo.getIterator(vec); it != vec.end(); it++) {cout << *it << " ";}std::cout << std::endl;
}

打印:

ok.    注意,getIterator函数中,decltype(iterator)() 这句代码构造了该迭代器类型的默认初始化对象。 

http://www.xdnf.cn/news/12843.html

相关文章:

  • 二叉数-100.相同的树-力扣(LeetCode)
  • LLMs 系列科普文(3)
  • 用于机器学习的 Podman 简介:简化 MLOps 工作流程
  • 从零开始的云计算生活——番外,实战脚本。
  • 【基于阿里云搭建数据仓库(离线)】使用UDTF时出现报错“FlatEventUDTF cannot be resolved”
  • Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
  • 04.管理表
  • Linux系统的CentOS7发行版安装MySQL80
  • Spring Boot 整合 Apache Flink 的详细过程
  • 二、即时通讯系统设计经验
  • Flink CDC —部署模式
  • 微软PowerBI考试 PL300-使用 Power BI 准备数据以供分析【提供练习数据】
  • 【iOS】多线程NSOperation,NSOperationQueue
  • 【C++系列】模板类型特例化
  • DeepSeek12-Open WebUI 知识库配置详细步骤
  • 音视频——I2S 协议详解
  • 【LeetCode 热题100】网格路径类 DP 系列题:不同路径 最小路径和(力扣62 / 64 )(Go语言版)
  • 【python深度学习】Day 48 PyTorch基本数据类型与操作
  • ArkUI-X与Android桥接通信之消息通信
  • STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
  • PHP环境极速搭建
  • 【Blender】Blender 通过 Python 实现模型大小压缩
  • 八股---7.JVM
  • 基于 React Native for HarmonyOS5 的跨平台组件库开发指南,以及组件示例
  • Cursor 编辑器, 使用技巧,简单记录一下
  • 求解一次最佳平方逼近多项式
  • 算法题(164):贴海报
  • 电力系统时间同步系统之三
  • 在 Java 中!(逻辑非)和 ||(逻辑或)的优先级关系
  • 生成模型从自回归到变分自动编码器