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

【C++】模板与泛型编程(一):定义模板,模板参数

16.1.3 模板参数

类似函数参数的名字,一个模板参数的名字也没有什么内在含义。通常将类型参数命名为 T,但实际上可以使用任何名字。(本节内容与template <typename T>当中的 T 有关)

模板参数与作用域

模板参数遵循普通作用域规则。一个模板参数名的可用范围是在其声明之后,至模板声明或定义结束之前。与任何其它名字一样,模板参数会隐藏外层作用域中声明的相同名字。但是与绝大多数其它上下文不同,在模板内不能重用模板参数名。

模板声明

模板声明必须包含模板参数

template<typename T> int compare(const T&, const T&);
template<typename T> class Blob;

最佳实践:一个特定文件所需要的所有模板声明通常一起放置在文件开始位置,出现于任何使用这些模板的代码之前。

使用类的类型成员

默认情况下,C++ 假定通过作用域运算符访问的名字不是类型。因此如果我们希望使用一个模板类型参数的类型成员,就必须显式告诉编译器该名字是一个类型,使用 typename 来实现这一点:

template <typename T>
typename T::value_type top(const T& c) {
	// ... ... ...
}

默认模板实参

就像我们可以为函数参数提供默认实参一样,我们也可以提供默认模板实参

现在我们重写 compare,默认使用标准库中的 less 函数对象模板:

template<typename T, typename F = less<T>>
int compare(const T &v1, const T &v, F f = F()) {
	if(f(v1, v2))	return -1;
	if(f(v2, v1))	return 1;
	return 0;
}

模板默认实参与类模板

无论何时使用一个类模板,都必须显式地在模板名之前加上尖括号。尖括号指出类必须从一个模板实例化而来:

template <class T = int> class Numbers {
	public:
		Numbers(T v = 0): val(v) { }
		// ... ... ...
	private:
		T val;
};
Numbers<long double> lots_of_precision;
Number<> average_precision;				// 空的 <> 表明我们希望使用默认类型

http://www.kler.cn/a/450453.html

相关文章:

  • Java代码覆盖率super-jacoco
  • V900新功能-电脑不在旁边,通过手机给PLC远程调试网关配置WIFI联网
  • javaEE--计算机是如何工作的-1
  • 使用Vue+Django开发的旅游路书应用
  • 重温设计模式--组合模式
  • 《Java 与 OpenAI 协同:开启智能编程新范式》
  • oracle: create new database
  • JavaScriptEs6 - String类和Array类扩展内容
  • ThinkPHP接入PayPal支付
  • 一个比RTK或redux更轻量级更易使用的 React 第三方状态管理工具库的配置与使用
  • 云手机方案总结
  • 代码随想录day25 回溯4
  • C++ 23版的最新特性
  • WebService简介
  • 建筑工地AI安全检测系统:YOLO11数据标注训练与PyQt5界面设计应用开发
  • 契约锁数智化合同大会全国巡展启动,助力合同管理全程数字化转型
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — Vision Kit(2)
  • 如何打造用户友好的维护页面:6个创意提升WordPress网站体验
  • 一键打断线(根据相交点打断)——CAD c# 二次开发
  • 查询Elasticsearch索引刷新间隔
  • [Unity Shader] 【游戏开发】【图形渲染】Shader数学基础3:矢量与标量的乘法与除法详解
  • IntelliJ IDEA 基本使用教程及Spring Boot项目搭建实战
  • 比亚迪“天神之眼”重磅升级,无图城市领航功能全国开通
  • I.MX6U 启动方式详解
  • mac 使用 launchctl 实现每次登录系统时 frpc 就会自动启动
  • js原型和原型链