C++ 函数模板与类模板

目录

引言

函数模板

基本概念

代码示例

解析

实例化

类模板

基本概念

代码示例

解析

实例化

总结


引言

在 C++ 中,模板(Template)是一种强大的特性,它允许我们编写通用的代码,以处理不同的数据类型。模板分为函数模板和类模板,本文将结合实际代码,详细解析这两种模板,并以代码中的 Stack 类模板为例进行深入探讨。

函数模板

在c语言中若要实现不同类型的交换,就要像这样实现多个函数(c语言甚至不支持函数重载)。

这样显得十分繁琐,于是c++引入了一个函数模板的概念。

基本概念

函数模板是一种通用的函数定义,它可以用于不同的数据类型。通过模板参数,我们可以在函数定义中使用一个或多个通用类型,而不是具体的数据类型。

代码示例

cpp 复制代码
template <class T>
T Add(const T& left, const T& right)
{
    return left + right;
}

template <class T1, class T2>
T2 Add(const T1& left, const T2& right)
{
    return left + right;
}

解析

  • template <class T> 是模板声明,T 是模板参数,可以代表任意数据类型。
  • Add 函数接受两个 T 类型的参数,并返回它们的和。
  • 第二个 Add 函数模板接受两个不同类型的参数 T1T2,并返回 T2 类型的结果。

实例化

函数模板的实例化可以通过两种方式进行:

  1. 推导实例化 :编译器根据函数调用时的参数类型自动推导模板参数的具体类型。

    cpp 复制代码
    int a = 10, b = 20;
    cout << Add(a, b) << endl; // 推导实例化为 Add<int>
  2. 显示实例化 :在函数调用时明确指定模板参数的具体类型。

    cpp 复制代码
    double c = 10.1;
    cout << Add<int>(a, c) << endl; // 显示实例化为 Add<int, double>

    在某些特殊的情况下,必须使用显式实例化来指定模板参数类型,如:

    cpp 复制代码
    template <class T>
    T Func(int n)
    {
        return new T[n];
    }
    
    int main()
    {
        double* p1 = Func<double>(10);
    }

    类模板

    基本概念

    类模板是一种通用的类定义,它允许我们创建可以处理不同数据类型的类。与函数模板类似,类模板也使用模板参数来表示通用类型。

    代码示例

    cpp 复制代码
    template <class T>
    class Stack
    {
    public:
        Stack(int n = 4)
            :_array(new T[n])
            ,_size(0)
            ,_capacity(n)
        {}
    
        ~Stack()
        {
            delete[] _array;
            _array = nullptr;
            _size = _capacity = 0;
        }
    
        void Push(const T& x)
        {
            if(_size == _capacity)
            {
                T* tmp = new T[_capacity * 2];
                memcpy(tmp, _array, sizeof(T) * _size);
                delete[] _array;
    
                _array = tmp;
                _capacity *= 2;
            }
            _array[_size++] = x;
        }
    
        void Print()
        {
            for(size_t i = 0; i < _size; i++)
            {
                cout << _array[i] << " ";
            }
            cout << endl;
        }
    
        void Pop()
        {
            --_size;
        }
    
    private:
        T* _array;
        size_t _size;
        size_t _capacity;
    };

    解析

  • template <class T> 是类模板的声明,T 是模板参数,表示栈中存储的数据类型。
  • Stack 类包含一个动态数组 _array,用于存储栈中的元素,以及 _size_capacity 分别表示栈的当前大小和容量。
  • Push 函数用于向栈中添加元素,如果栈已满,则进行扩容操作。
  • Print 函数用于打印栈中的所有元素。
  • Pop 函数用于从栈中移除栈顶元素。

实例化

类模板必须进行显式实例化,即在创建对象时明确指定模板参数的具体类型。

cpp 复制代码
Stack<int> st;
st.Push(1);
st.Push(2);
st.Push(3);
st.Push(4);
st.Print();

st.Pop();
st.Print();

总结

函数模板和类模板是 C++ 中非常重要的特性,它们可以帮助我们编写通用的代码,提高代码的复用性和可维护性。函数模板可以根据函数调用时的参数类型自动推导或显式指定模板参数的具体类型,而类模板必须进行显式实例化。通过使用模板,我们可以编写出更加灵活和高效的代码。

以上就是对 C++ 函数模板和类模板的详细解析,希望对你有所帮助。

相关推荐
霜羽68928 分钟前
【C++篇】模版进阶
开发语言·c++
给老吕螺丝23 分钟前
C 语言作用域与存储期深度解析:空间与时间的双重维度
c语言·开发语言·经验分享·笔记
超闻逸事27 分钟前
题解:CF2129C Interactive RBS
c++·算法·codeforces
CHEN5_0231 分钟前
【Java面试题】缓存穿透
java·开发语言·数据库·redis·缓存
UQWRJ1 小时前
R语言基础图像及部分调用函数
开发语言·r语言
搜狐技术产品小编20231 小时前
浅析责任链模式在视频审核场景中的应用
java·开发语言·责任链模式
一方热衷.1 小时前
YOLOv8/YOLOv11 C++ OpenCV DNN推理
c++·opencv·yolo
玉树临风江流儿2 小时前
QT收费情况
开发语言·qt
ankleless2 小时前
C语言(02)——标准库函数大全(持续更新)
c语言·开发语言·算法·标准库函数·零基础自学
玖剹2 小时前
Linux文件系统:从内核到缓冲区的奥秘
linux·c语言·c++·笔记·ubuntu