C++_模板(template)_模板类_模板函数_模板变量

在C++中,模板(Templates)是实现泛型编程的核心机制。它允许你编写与类型无关的代码,从而提高代码的复用性和灵活性。C++中的模板主要分为三种:模板函数、模板类和模板变量(C++14引入)。下面分别进行详细介绍。

1. 模板函数(Function Templates)

模板函数允许你编写一个函数,使其可以处理多种数据类型,而无需为每种类型重复编写代码。
基本语法:


template <typename T>
返回类型 函数名(参数列表) {
    // 函数体
}

或使用 class 关键字(与 typename 等价):


template <class T>
...

示例:


#include <iostream>
using namespace std;

// 定义一个模板函数,返回两个值中的较大者
template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << max(3, 5) << endl;        // 调用 max<int>
    cout << max(3.14, 2.71) << endl;  // 调用 max<double>
    cout << max('a', 'z') << endl;    // 调用 max<char>
    return 0;
}

注意事项:

编译器会根据调用时的参数类型自动推导模板参数(类型推导)。
也可以显式指定模板参数:max<int>(3, 5)。
模板函数在编译时实例化,生成对应类型的函数。

2. 模板类(Class Templates)

模板类允许你定义一个通用的类,其数据成员和成员函数可以使用一个或多个未指定的类型。
基本语法:


template <typename T1, typename T2, ...>
class 类名 {
    // 类定义
};

示例:


#include <iostream>
using namespace std;

// 定义一个简单的模板类,表示一个包含两个值的对
template <typename T>
class Pair {
private:
    T first, second;
public:
    Pair(T a, T b) : first(a), second(b) {}

    void display() const {
        cout << "(" << first << ", " << second << ")" << endl;
    }

    T getSum() const {
        return first + second;
    }
};

int main() {
    Pair<int> p1(10, 20);
    p1.display();  // 输出: (10, 20)
    cout << "Sum: " << p1.getSum() << endl;  // 输出: 30

    Pair<double> p2(3.14, 2.86);
    p2.display();  // 输出: (3.14, 2.86)

    return 0;
}

多模板参数示例:


template <typename T, typename U>
class KeyValuePair {
    T key;
    U value;
public:
    KeyValuePair(T k, U v) : key(k), value(v) {}
    void print() const { cout << key << ": " << value << endl; }
};

成员函数模板:

类内部也可以定义模板成员函数:


class MyClass {
public:
    template<typename T>
    void print(T value) {
        cout << value << endl;
    }
};

3. 模板变量(Variable Templates) - C++14 引入

C++14引入了变量模板,允许你定义一个模板化的变量,通常用于定义与类型相关的常量。
基本语法:


template <typename T>
constexpr 类型 变量名 =;

示例:


#include <iostream>
#include <limits>
using namespace std;

// 定义一个模板变量,表示某种类型的“最大值”
template <typename T>
constexpr T max_value = numeric_limits<T>::max();

// 定义一个通用的pi值,根据类型选择精度
template <typename T>
constexpr T pi = T(3.1415926535897932385L);

int main() {
    cout << "int max: " << max_value<int> << endl;
    cout << "double pi: " << pi<double> << endl;
    cout << "float pi: " << pi<float> << endl;
    return 0;
}

优势:

避免了为每种类型单独定义常量。
提高了代码的可维护性和一致性。
常用于数学库、类型特征(type traits)等场景。

总结对比

在这里插入图片描述

高级特性(简要提及)

模板特化(Specialization):为特定类型提供定制实现。
偏特化(Partial Specialization):仅对部分模板参数进行特化(仅适用于类模板)。
可变参数模板(Variadic Templates):支持任意数量的模板参数(C++11)。
概念(Concepts):C++20引入,用于约束模板参数类型,提高错误信息可读性。

模板是C++强大类型系统和泛型能力的体现,掌握它们对于编写高效、可复用的现代C++代码至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值