c++学习笔记之成员模板

简介:
任意类(模板或者是飞模板)可以拥有类模板或函数模板的成员,这种成员成为成员模板,成员模板不能为虚。成员模板的一个例子是标准容器的assign成员,接受两个迭代器的assign版本使用模板形参表示其迭代器形参的类型。另一个例子就是接受两个迭代器的容器构造函数。
1 定义成员模板
模板成员声明看起来像任意模板的声明一样。
template <class Type> class Queue{
    public:
        template <class It>Queue(It beg,It end){
            copy_elems(beg,end);
        }
        template <class Iter> void assign(Iter,Iter);
    private:
        template <class Iter> void copy_elems(Iter,Iter);
};

template <class Type> template <class Iter>
void Queue<Type>::assign(Iter beg,Iter end){
    //destroy();
    copy_elems(beg,end);
}

template <class Type> template <class Iter>
void Queue<Type>::copy_elems(Iter beg,Iter end){
    while(beg != end){
        push(*beg);
        ++beg;
    }
}
成员声明的开头是自己的模板形参表。构造函数和assign函数各有一个模板类型形参,这些函数使用这些类型形参作为其函数形参的类型,他们函数

形参指明要复制元素范围的迭代器。


2 在类外定义成员模板
在类模板作用域外部定义成员模板的时候,那必须包含两个模板形参表:
template <class Type> template <class Iter>
void Queue<Type>::assign(Iter beg,Iter end){
    //destroy();
    copy_elems(beg,end);
}

当成员模板时类模板的成员时,它的定义必须包含类模板形参以及自己的模板形参。
首先是类模板形参表,后面接着是自己模板形参表。
assign函数定义的开头为:
template <class Type> template <class Iter>
第一个模板形参表template <class Type>为类模板的,第二个模板形参表template <class Iter>是成员模板的。
3 成员模板的实例化
成员模板只有在程序使用时才实例化。类模板的成员模板的实例化要比类模板的普通成员函数的实例化要复杂一些。
成员模板有两种模板形参:(1)由类定义的(2)由成员模板本身定义的
类模板形参由调用函数的对象的类型确定,成员定义的模板形参的行为与普通函数模板一样。这些形参都通过常规模版实参推断确定。
short a[4] = {0,3,6,9};
    Queue<int> qi(a,a+4);
    vector<int> vi(a,a+4);
    qi.assign(vi.begin(),vi.end());

因为所构造的是Queue<int>类型的对象,我怕们知道编译器将为Queue<int>实例化基于迭代器构造函数。该构造函数本身模版形参的类型由编译器根据a和a+4的类型推断,而该类型为short指针。因此,qi的定义实例化:
void Queue<int>::Queue(short *,short *);
对assign的调用将实例化qi的成员。qi具有Queue<int>类型,因此,这个调用将实例化名为assign的Queue<int>成员。该函数为函数模版,想起他任意的函数模版一样,编译器从传给调用者的实参推断assign的模版实参,推断得到的类型是vector<int>::iterator,这个调用实例化:
void Queue<int>::assign(vector<int>::iterator,vector<int>::iterator);

目录
相关文章
|
10天前
|
存储 C++ 容器
C++STL(标准模板库)处理学习应用案例
使用C++ STL,通过`std:vector`存储整数数组 `{5, 3, 1, 4, 2}`,然后利用`std::sort`进行排序,输出排序后序列:`std:vector&lt;int&gt; numbers; numbers = {5, 3, 1, 4, 2}; std:sort(numbers.begin(), numbers.end()); for (int number : numbers) { std::cout &lt;&lt; number &lt;&lt; &quot; &quot;; }`
15 2
|
20天前
|
编译器 C++
C++入门指南:10分钟带你快速了解模板究竟是什么(建议收藏!!)
C++入门指南:10分钟带你快速了解模板究竟是什么(建议收藏!!)
27 0
|
23天前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
238 2
|
1天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
10天前
|
程序员 C++
C++语言模板学习应用案例
C++模板实现通用代码,以适应多种数据类型。示例展示了一个计算两数之和的模板函数`add&lt;T&gt;`,可处理整数和浮点数。在`main`函数中,展示了对`add`模板的调用,分别计算整数和浮点数的和,输出结果。
10 2
|
18天前
|
存储 安全 编译器
【C++】类的六大默认成员函数及其特性(万字详解)
【C++】类的六大默认成员函数及其特性(万字详解)
33 3
|
22天前
|
存储 程序员 编译器
【C++ 模板类与虚函数】解析C++中的多态与泛型
【C++ 模板类与虚函数】解析C++中的多态与泛型
46 0
|
22天前
|
算法 编译器 C++
【C++ 模板编程 基础知识】C++ 模板类部分特例化的参数顺序
【C++ 模板编程 基础知识】C++ 模板类部分特例化的参数顺序
20 0
|
20天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
20天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
30 0

热门文章

最新文章