c++标准模板库使用
- 格式:pdf
- 大小:331.77 KB
- 文档页数:35


c++类模板template中的typename使⽤⽅法-超级棒
转载:https:///vanturman/article/details/80269081
近⽇,看到这样⼀⾏代码:
typedef typename __type_traits::has_trivial_destructor trivial_destructor;
看起来它应该是定义⼀个类型别名,但是typedef不应该是像这样使⽤么,typedef+原类型名+新类型名:
typedef char* PCHAR;
可为何此处多了⼀个typename?另外__type_traits⼜是什么?
看起来有些眼熟,想起之前在Effective C++上曾经看过traits这⼀技术的介绍,和这⾥的__type_traits有点像。只是⼀直未曾遇到需要traits的时
候,所以当时并未仔细研究。然⽽STL中⼤量的充斥着的traits,⼀查才发现原来它是⼀种⾮常⾼级的技术,在更现的⾼级语⾔中已经很普
遍。因此这次花了些时间去学习它,接下来还有会有另⼀篇⽂章来详细介绍C++的traits技术。在这⾥,我们暂时忘记它,仅将它当成⼀个普
通的类,先来探讨⼀下这个多出来的typename是怎么回事?
typename的常见⽤法
对于typename这个关键字,如果你熟悉C++的模板,⼀定会知道它有这样⼀种最常见的⽤法(代码摘⾃C++ Primer)
// implement strcmp-like generic compare function
// returns 0 if the values are equal, 1 if v1 is larger, -1 if v1 is smaller
template
int compare(const T &v1, const T &v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
1 / 4
使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。
1 static_cast
用法:static_cast < type-id > ( expression )
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类和子类之间指针或引用的转换。
进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
2 dynamic_cast
用法:dynamic_cast < type-id > ( expression )
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *; 如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
class B{
如何导出标准模板库(STL)类的实例化和包含STL类对象数据
成员的类
概要本⽂讨论如何实现下⾯任务:
导出标准模板库(STL)类的实例化。
导出包含STL类对象数据成员的类。
注意,您⽆法导出通⽤的模板,模板必须实例化才能导出。也就是说,必须提供所有的模板参数,并且在实例化时,模板的参数必须是完全
定义的类型。例如stack实例化STL堆栈类,实例化时强制⽣成类stack的所有成员。
还要注意,⼀些STL容器(map、set、queue、list、deque)⽆法导出。
更多信息
从VC++ 5.0开始,可以强制对模板类进⾏实例化并导出实例化类。导出实例化模板类,可使⽤以下语法:
导出STL类
1. 在.dll和.exe⽂件中,必须链接到相同版本的C运⾏时库dll。两个都链接msvcrt.lib(Release版本)或都链接到msvcrtd.lib(Debug版本)。
2. 在dll中,在模板的实例化声明中使⽤__declspec修饰符,以便从dll中导出STL类的实例化。
3. 在exe中,需提供使⽤extern和__declspec修饰的模板实例化声明,以便从dll中导⼊类。 这会导致警告 C4231 "nonstandard extension used :
'extern' before template explicit instantiation." 。 您可以忽略此警告。
导出包含STL类对象数据成员的类
1. 在.dll和.exe⽂件中,必须链接到相同版本的C运⾏时库dll。两个都链接msvcrt.lib(Release版本)或都链接到msvcrtd.lib(Debug版本)。
2. 在dll中,在模板的实例化声明中使⽤__declspec修饰符,以便从dll中导出STL类的实例化。
注意:不能跳过上⼀步,⽤于创建数据成员的STL类必须导出其实例化。
3. 在dll中,在类的声明中使⽤__declspec修饰符,以便从dll中导出类。
c 标准模板库 pdf
C++标准模板库(STL)是C++语言的一个重要组成部分,它提供了一系列的通用模板类和函数,用于实现常见的数据结构和算法。STL的设计目标是提供高效、灵活和易于使用的数据结构和算法,以便程序员可以更加专注于解决问题,而不是实现基本的数据结构和算法。
STL包含了多个组件,其中最重要的是容器(container)、算法(algorithm)和迭代器(iterator)。容器用于存储数据,包括序列容器(如vector、deque、list)、关联容器(如set、map)和容器适配器(如stack、queue)。算法用于处理容器中的数据,包括排序、查找、合并等操作。迭代器用于在容器中遍历数据,提供了统一的访问接口,使得算法可以与容器独立地工作。
C++标准模板库的设计借鉴了许多经典的数据结构和算法,同时也引入了许多新的概念和技术。STL的设计理念是将数据结构和算法分离,使得它们可以独立地演化和重用。这种设计使得STL具有很高的灵活性和可扩展性,可以满足不同场景下的需求。
除了提供标准的数据结构和算法外,C++标准模板库还提供了一些辅助工具,如函数对象、适配器、迭代器的特性标签等。这些工具可以帮助程序员更加方便地实现自定义的数据结构和算法,提高代码的可重用性和可维护性。
C++标准模板库的实现通常由编译器厂商提供,也可以由第三方库提供。不同的实现可能在性能、兼容性、扩展性等方面有所差异,程序员需要根据具体的需求选择合适的实现。
在使用C++标准模板库时,程序员需要熟悉STL的基本概念和使用方法,了解常见的数据结构和算法的特性和适用场景,以及掌握一些常用的技巧和注意事项。此外,还需要注意STL的一些陷阱和注意事项,如迭代器失效、内存泄漏、性能损耗等。 总的来说,C++标准模板库是C++语言的一个重要组成部分,它提供了丰富的数据结构和算法,可以帮助程序员更加高效地实现复杂的问题。掌握STL的基本概念和使用方法,对于提高C++程序员的编程水平和解决实际问题都有很大的帮助。希望本文能够帮助读者更加深入地了解C++标准模板库,提高他们在实际项目中的应用能力。