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)() 这句代码构造了该迭代器类型的默认初始化对象。 

目录:网盘文件永久链接第一章 NG WDM系统硬件 1.1_NG WDM系统硬件 (1) 1.2_NG WDM系统硬件 (2) 1.3_NG WDM系统硬件 (3) 第二章 NG WDM设备组网与应用 2.1_网络层次和系统架构 2.2_站点类型 2.3_站点应用场景和组网基本要素 第三章 NG WDM光电层调度方案 3.1_NG WDM光层调度方案 3.2_NG WDM电层调度方案 第四章 NG WDM通用数据配置 4.1_配置前准备 4.2_创建并配置网元和网络 4.3_备份网元数据库 第五章 NG WDM光层业务配置 5.1_WDM光层数据配置 第六章 NG WDM电层业务配置 6.1_NG-WDM电层业务配置 第七章 NG WDM系统调测 7.1_调测前准备 7.2_非相干系统调测 7.3_相干系统光功率调测、混传系统光功率调测与系统调测 第八章 NG WDM系统常用指标测试 8.1_NG WDM 系统常用指标测试 第九章 NG WDM设备保护 9.1_设备保护,光层保护 - 光线路保护 9.2_光层保护 - 板内1+1,客户侧1+1与电层保护 第十章 NG WDM设备日常维护 10.1_设备侧日常维护 10.2_网管侧日常维护 第十一章 NG WDM告警信号流 11.1_概述与光层告警分析 11.2_电层告警分析 第十二章 NG WDM 系统故障处理 12.1_故障处理准备与故障定位思路 12.2_常见故障分析与故障案例 第十三章 SOM智慧光管系统专题 13.1_SOM系统介绍 13.2_SOM系统原理 13.3_SOM系统配置与操作 第十四章 智能光纤管理系统专题 14.1_智能光纤管理系统介绍 14.2_线路光纤质量监测原理 14.3_光纤质量检测功能的使用 第十五章 NG WDM 分组技术简介 15.1_IP概述 15.2_MPLS技术 15.3_PWE3技术 15.4_MPLS-TP技术 第十六章 MS-OTN 组网与业务介绍 16.1_网络应用 16.2_业务介绍 16.3_网络保护 第十七章 OptiX OSN 1800V 分组业务配置 17.1_Optix OSN 1800V分组业务配置 第十八章 新技术专题 18.1_新技术专题 第十九章 MSTP技术专题-时钟保护 19.1_时钟保护的基本概念与标准SSM时钟保护协议 19.2_扩展SSM时钟保护协议 第二十章 MSTP技术专题-ECC维护、指针调整 20.1_MSTP技术专题-ECC维护、指针调整 第二十一章 MSTP技术专题-PCM技术 21.1_PCM技术原理与应用 21.2_PCM单板 第二十二章 MSTP单板更替换 22.1_单板更替换概述 22.2更换故障单板 22.3_单板兼容替代 22.4_单板容量升级 第二十三章 离散业务分析与处理 23.1_离散业务的基本概念 23.2_ 离散业务产生的原因和处理方法 23.3_离散业务的清理步骤 23.4_如何避免产生离散业务 第二十四章 以太网业务常见指标测试 24.1_以太网基本概念 24.2_以太网性能测试简介 24.3_以太网业务常见测试指标 24.4_以太网业务常见指标测试步骤 第二十五章 MSTP设备故障处理 25.1_故障定位准备 25.2_故障定位方法 25.3_故障案例分析 第二十六章 ASON智能光网络 26.1_ASON介绍与基本功能 26.2_ASON功能特性(1) 26.3_ASON功能特性(2) 26.4_2M ASON介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值