c++函数模板和运行机制

这篇具有很好参考价值的文章主要介绍了c++函数模板和运行机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++_template

c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。

  • c++提供两种模板机制:函数模板和类模板
  • 类属:类型参数化,又称参数模板

函数模板

函数模板是 C++ 中的一种特性,它允许你编写一个通用的函数,能够处理不同类型的数据,而不需要针对每种类型编写多个函数。通过函数模板,你可以编写一次代码,然后使用不同的数据类型来实例化该函数,从而生成针对不同数据类型的具体函数。

函数模板可以处理各种不同的数据类型,只要这些数据类型支持所执行的操作。例如,你可以使用函数模板来编写一个通用的排序函数,它可以对整数、浮点数、字符串等进行排序,而无需为每种类型编写一个特定的排序函数。

假设现在有几个类似函数:

void SwapInt(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

void SwapChar(char& a, char& b) {
	char temp = a;
	a = b;
	b = temp;
}

如果要交换double,bool等其他类型时,需要重复写很多个功能相同的函数。写的函数越多,当交换逻辑发生变化的时候,所有的函数都需要修改,无形当中增加了代码的维护难度。

template<class T>

void Swap(T& a, T& b) {
	T temp = a;
	a = b;
	b = temp;
}
void test() {
	int a = 10;
	int b = 20;
	cout << "a:" << a << " b:" << b << endl;
	//1. 这里有个需要注意点,函数模板可以自动推导参数的类型
	Swap(a, b);
	cout << "a:" << a << " b:" << b << endl;
	cout << "-----------------\n";
	char c1 = 'a';
	char c2 = 'b';
	cout << "c1:" << c1 << " c2:" << c2 << endl;
	//2. 函数模板可以自动类型推导,那么也可以显式指定类型
	Swap<char>(c1, c2);
	cout << "c1:" << c1 << " c2:" << c2 << endl;
}

c++函数模板和运行机制

普通函数和函数模板区别

  1. 定义
    • 普通函数:定义时指定了具体的参数类型和返回类型,如 int add(int a, int b)
    • 函数模板:定义时使用关键字 template 并在尖括号中声明模板参数,如 template <typename T> T add(T a, T b)
  2. 参数类型
    • 普通函数:参数类型是固定的,无法处理不同类型的参数。
    • 函数模板:参数类型可以是模板参数,因此可以处理不同类型的参数。
  3. 具体化
    • 普通函数:只有一份具体的实现,不支持根据参数类型动态生成多个版本。
    • 函数模板:可以根据不同的模板参数生成多个具体化的版本,以应对不同的参数类型。
  4. 类型推断
    • 普通函数:参数类型必须显式指定。
    • 函数模板:可以通过函数参数的类型自动推断模板参数的类型。
  5. 使用
    • 普通函数:直接调用,参数类型必须与函数声明中指定的类型相匹配。
    • 函数模板:使用时可以通过显式指定模板参数的方式实例化模板,也可以让编译器自动推断模板参数的类型。

函数模板和普通函数在一起调用规则

  1. c++编译器优先考虑普通函数
  2. 可以通过空模板实参列表的语法限定编译器只能通过模板匹配
  3. 函数模板可以像普通函数那样可以被重载
  4. 如果函数模板可以产生一个更好的匹配,那么选择模板
template<class T>
T MyPlus(T a, T b) {
	T ret = a + b;
	return ret;
}
//普通函数
int MyPlus(int a, int b) {
	int ret = a + b;
	return ret;
}
void test() {
	int a = 10;
	int b = 20;
	char c = 'a';
	char d = 'b';
	//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数
	cout << MyPlus(a, b) << endl;
	//如果我必须要调用函数模板,那么怎么办?
	cout << MyPlus<>(a, b) << endl;
	//此时普通函数也可以匹配,因为普通函数可以自动类型转换
	//但是此时函数模板能够有更好的匹配
	//如果函数模板可以产生一个更好的匹配,那么选择模板
	cout << MyPlus(c, d);
}

c++函数模板和运行机制

为什么函数模板可以和普通函数放在一起?c++编译器是如何实现函数模板机制的?

hello.cpp程序是高级c语言程序,这种程序易于被人读懂。为了在系统上运行hello.c程序,每一条c语句都必须转化为低级的机器指令。然后将这些机器指令打包成可执行目标文件格式,并以二进制形式存储于磁盘中。

预处理(Pre-processing) -> 编译(Compiling) ->汇编(Assembling) -> 链接(Linking)

c++函数模板和运行机制

函数模板机制结论:文章来源地址https://www.toymoban.com/news/detail-855036.html

  • 编译器并不是把函数模板处理成能够处理任何类型的函数: 函数模板本身并不是完整的可执行代码,而是一种通用的模板。编译器在编译过程中不会将函数模板直接处理成能够处理任何类型的函数,而是根据模板定义和实际使用情况生成特定类型的函数代码。这意味着函数模板并不直接对应于实际可执行的函数代码,而是在使用时根据模板参数生成相应的函数代码。
  • 函数模板通过具体类型产生不同的函数: 当程序中使用函数模板并提供具体类型的参数时,编译器会根据模板定义生成针对这些具体类型的函数代码。这个过程称为模板实例化。换句话说,函数模板在编译过程中会根据模板参数的具体类型产生不同的函数实现,以适应不同类型的参数。
  • 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译: 这是指编译器在处理函数模板时的两个重要阶段:模板声明和模板实例化。在模板声明阶段,编译器会对函数模板的语法进行检查,并确保模板定义的正确性。在模板实例化阶段,编译器会根据模板参数的具体类型,对模板代码进行替换并生成实际的函数代码。这两个阶段都是在编译过程中发生的,但它们的重点和操作对象略有不同。

到了这里,关于c++函数模板和运行机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++模板,STL(Standard Template Library)

    这篇文章的主要内容是C++中的 函数模板 、 类模板 、 STL的介绍 。 希望对C++爱好者有所帮助, 内容充实且干货 ,点赞+收藏防止找不到! 再次感谢每个读者和正在学习编程的朋友莅临! 更多优质内容请点击移驾: C++收录库:重生之C++启程(文章平均质量分93) 目录   1.模板

    2024年02月13日
    浏览(44)
  • C++进阶语法——STL 标准模板库(下)(Standard Template Library)【学习笔记(七)】

    1、迭代器 迭代器可以将任意的容器抽象成一个序列,可以使用迭代器遍历容器中的元素 迭代器设计的目的是为了解决容器与算法之间的耦合问题,与指针类似,可以通过迭代器访问容器中的元素 迭代器的声明方式为: 容器类型::iterator 变量名称 , 可以理解为一个普通的指

    2024年02月06日
    浏览(46)
  • 浅谈WPF之控件模板Control Template和数据模板Data Template

    WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计,同时还推出了以模板为核心的新一代设计理念。在WPF中,通过引入模板,将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类:数据模板【Data Template】和控件模板【Control Template】 基本上,ControlT

    2024年02月03日
    浏览(34)
  • 【C++】——模板(泛型编程+函数模板+类模板)

    之前我们学习了函数重载,让我们在写相似函数的时候非常方便,但函数重载还有很多不足的地方,比如,每次写相似函数的时候,都要我们重新重载一个逻辑、代码几乎一样的函数,这就导致了我们的效率变低,所以我们今天来学习C++模板的相关知识点,学习完模板之后,

    2024年02月05日
    浏览(46)
  • 浅述C++模板——函数模板及类模板

    模板作为 C++ 的一大特色,对于泛型编程有着重要的作用。同时,对于大规模类似的函数或是类型不确定的类,模板都起了至关重要的作用。 在开始学习模板之前,我们首先需要了解模板。先看下面一个例子: 我们可以轻易发现,对于函数 func_one、func_two,两者实现的功能基

    2024年02月09日
    浏览(43)
  • 【C++】什么是函数模板/类模板?

    函数模板简单来说就是一个模板,与函数参数的类型无关,是一个模子,不是真正的函数,实例化的函数会根据实参的类型 自动 推导类型。 函数模板是一个模板,并不是真正的函数,它是根据传递过来的实参的类型实例化一个具体的函数,相当于我们将重复的事情交给了编

    2024年02月07日
    浏览(56)
  • C++ 函数模板与类模板

    现在的C++编译器实现了C++新增的一项特性–函数模板。函数模板是通用的函数描述,也就是说它们使用泛型来定义函数,其中的泛型可以是具体的类型(如int或double)。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。用于模板允许以泛型的方式编写程序,因

    2023年04月19日
    浏览(44)
  • C++函数模板和类模板

    C++另一种编程思想称为泛型编程,主要利用的技术是模板 C++提供两种模板机制:函数模板和类模板 即:我们提供一个抽象的函数或类,并不具体指定其中数据的类型,而是某个虚拟类型代替。只提供基本的功能。其具体的数据类型,只在其被调用时视具体情况实例化。 举个

    2024年02月12日
    浏览(40)
  • C++——函数模板与类模板

    C++知识合集 目录 1.泛型编程 2.函数模板 2.1函数模板实例化 2.2函数模板参数的匹配原则 3.类模板 4.模板的分离编译 实际上泛型编程的难度是比较高的,但我们泛型编程的初学者,当然要从简单的地方开始入手。 我们可以写出很多份交换函数,这些函数之间构成函数重载,这

    2024年02月08日
    浏览(41)
  • 【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

    在 C++ 语言中 , 泛型编程 的 核心就是 函数模板 和 类模板 ; 函数模板 Function Template 是 C++ 语言 中的 重要特性 ; 函数模板概念 : 建立一个 \\\" 通用函数 \\\" , 不指定该函数的 函数返回值类型 和 函数参数类型 , 仅使用 \\\" 虚拟类型 \\\" 代表 上述 两种类型 , 该 \\\" 通用函数 \\\" 就是 \\\" 函数模

    2024年02月19日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包