C 中的模板元编程
- 格式:pdf
- 大小:120.63 KB
- 文档页数:5


C语⾔的模板与泛型编程你了解吗⽬录模板与泛型编程浅谈
摘要(Effective C++):模板与泛型编程简单介绍函数模板模板编译类模板为什么我们需要模板特例化?总结
模板与泛型编程浅谈
摘要(Effective C++):
C++template的最初发展动机很直接:让我们得以建⽴“类型安全”的容器如vector,list和map。然⽽当愈多⼈⽤上templates时,他们发现template有能⼒完成愈多可能的变化。
容器当然很好,但泛型编程(generic programming)——写出的代码和其所处理的对象类型彼此独⽴——更好。STL算法如for_each,find和merge就是这⼀类编程的结果。最
终⼈们发现,C++template机制⾃⾝是⼀部完整的图灵机:它可以⽤来计算任何可计算的值。于是导出了模板元编程(template mataprogramming),创造出“在C++编译器内执
⾏并于编译完成时停⽌执⾏”的程序。
模板与泛型编程简单介绍
⾯向对象编程(OOP)和泛型编程都可以处理编写程序时不知道类型的情况;⼆者的不同之处在于:OOP能处理类型在程序运⾏之前都未知的情况;⽽在泛型编程中,在编
译时就能获知类型了
我们所常⽤的STL标准库中,每⼀个容器都提供了单⼀的,泛型的定义,例如我们所常⽤的vector,我们可以定义很多类型的vector
vector vi; // vi是装载int类型的vector容器的实例
vector vs; // vs是装载string类型的vector容器的实例
vector vd; // vd是装载double类型的vector容器的实例
模板是泛型编程的基础,⼀个模板就是⼀个创建类或者函数的蓝图或者公式
函数模板
// 简单的⽐较函数模板
template
int cmp(const T& v1,const T& v2) {
if(v1
return -1;
else if(v1>v2)
c++ template 实现原理
C++模板是一种编程工具,它可以在编译时进行泛型编程。它允许我们在代码中定义一种通用的类型或算法,使其适用于多种不同的类型,而无需为每种新类型编写新的代码。
C++模板的实现原理可以分为两个阶段:实例化和实例化后的代码生成。
在实例化阶段,编译器扫描模板代码,找到模板声明,并根据模板被调用时的参数类型,生成模板实例。例如,假设我们有一个模板函数add,并在代码中调用该函数add(2, 3)。在实例化阶段,编译器会根据模板函数add的定义,生成一个具有int类型参数的实例。这个过程称为模板实例化。
在实例化后的代码生成阶段,编译器会根据生成的模板实例,生成对应的函数或类代码。这些代码与普通的函数或类定义具有相同的形式,只是参数类型被模板参数替代。生成的代码会被链接器处理,以生成最终的可执行文件。 C++模板的实现原理依赖于编译器的支持。在编译器实现中,有两种常见的模板实现方法:编译时生成和二次编译。
编译时生成是指编译器在实例化阶段直接将模板代码转换为对应的实例代码。在这种实现方法中,编译器会在模板被调用时生成对应的实例代码,并将其插入到编译单元中。这种方法的优点是生成的代码效率高,缺点是编译时间可能会增长,特别是当模板被多次实例化时。
二次编译是指编译器在生成模板实例后,使用实例化后的代码进行二次编译。在这种实现方法中,编译器会将模板实例生成为中间表示形式,然后在实例化完成后,将中间表示形式作为输入,生成对应的机器代码。这种方法的优点是编译时间快,缺点是生成的代码可能会比编译时生成的代码效率低一些。
无论是编译时生成还是二次编译,模板实例化都是通过对模板参数类型进行替换来完成的。编译器会根据调用模板时的参数类型,在模板代码中进行相应的替换。这个过程称为模板参数推导。
模板参数推导是通过编译器进行类型推导来实现的。编译器会根据模板代码和调用代码中的参数类型,推导出模板参数的具体类型。在模板参数推导的过程中,编译器会根据一定的规则进行类型匹配,并根据匹配结果生成模板实例。
C++ 中的 args... 是变参模板(variadic template)的语法,它允许一个模板函数或类接受可变数量的参数。
变参模板的原理是使用模板元编程技术,通过递归的方式处理可变数量的参数。在编译时,编译器会根据传递给模板的参数数量和类型,生成相应的函数或类实例。
在变参模板中,使用 args... 来表示可变数量的参数。当模板函数或类被实例化时,参数会被展开并传递给模板函数或类。
变参模板可以用于实现一些通用编程的场景,例如可变参数函数、可变参数类等。通过使用变参模板,可以编写更加灵活和通用的代码,提高代码的复用性和可维护性。
需要注意的是,由于变参模板涉及到编译时元编程,因此需要谨慎使用,以避免产生难以调试的错误。同时,由于编译器对变参模板的支持程度不同,因此在使用时需要注意兼容性问题。
简述c++发展史
C++是⼀门以C为基础发展⽽来的⼀门⾯向对象的⾼级程序设计语⾔,从1983年由Bjarne Stroustrup教授在贝尔实验室创⽴开
始⾄今,已有30多个年头。C++从最初的C with class,经历了从C++98、C++ 03、C++ 11、C++ 14再到C++17多次标准化
改造,功能得到了极⼤的丰富,已经演变为⼀门集⾯向过程、⾯向对象、函数式、泛型和元编程等多种编程范式的复杂编程语
⾔,⼊门具有⼀定的难度。由于C++过于复杂,并且经历了长时间的发展演变,⽬前对于C++标准⽀持的较好主要有GNUC++和Visual C++,严格来说,⽬前还没有⼀个完全⽀持ISO C++的版本。
1954年,John Backus发明了世界上第⼀种计算机⾼级语⾔Fortran,为之后出现的⾼级编程语⾔奠定了基础。1970
年,AT&T的Bell实验室的 Ken Thompson,以BCPL语⾔为基础,设计出简单且接近硬件的B语⾔(取BCPL的⾸字母),并
且他⽤B语⾔写了第⼀个Unix操作系统。到了1972年,Bell实验室的Dennis Ritchie和Ken Thompson共同发明了C语⾔,并使
⽤C重写Unix。1979年,Bjame Stroustrup到了Bell实验室,开始从事将C改良为带类的C(C with Classes)的⼯作,1983年
该语⾔被正式命名为C++,主要意图是表明C++是C的增强版,1985年发布了第⼀个C++版本。
第⼀个版本的C++,因其⾯向对象的思想使得编程变得简单,并且⼜保持了C语⾔的运⾏效率,在推出的⼀段时间内,得到了
快速的发展,占据了编程语⾔界的半壁江⼭。从1985年到1998年,C++从最初的C with Classes新增了很多其他的特性,⽐
如异常处理、模板、标准模板库(STL)、运⾏时异常处理(RTTI)与名字空间(Namespace)等。1998年,C++标准委员