C++模板——非类型模板参数、模板的特化以及模板的分离编译

目录

非类型模板参数

模板的特化

概念

函数模板特化

类模板特化

全特化

偏特化

模板的分离编译

什么是分离编译

模板的分离编译

解决方法

模板总结


非类型模板参数

模板参数可分为类型形参和非类型形参。
类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。
非类型形参: 用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

例如,我们要实现一个静态数组的类,就需要用到非类型模板参数。

#include <iostream>

template <class T, std::size_t N>
class StaticArray {
public:
    // 获取数组大小
    constexpr std::size_t arraysize() const {
        return N;
    }

    // 获取数组中的元素(带边界检查)
    T& operator[](std::size_t index) {
        if (index >= N) {
            throw std::out_of_range("Index out of range");
        }
        return _array[index];
    }

    // 获取数组中的元素(常量版本,带边界检查)
    const T& operator[](std::size_t index) const {
        if (index >= N) {
            throw std::out_of_range("Index out of range");
        }
        return _array[index];
    }

    // 填充数组中的所有元素
    void fill(const T& value) {
        for (std::size_t i = 0; i < N; ++i) {
            _array[i] = value;
        }
    }

    // 打印数组内容
    void print() const {
        for (std::size_t i = 0; i < N; ++i) {
            std::cout << _array[i] << " ";
        }
        std::cout << std::endl;
    }

private:
    T _array[N]; // 利用非类型模板参数指定静态数组的大小
};

int main() {
    StaticArray<int, 5> arr;

    // 填充数组
    arr.fill(10);

    // 打印数组内容
    arr.print();

    // 访问和修改数组元素
    arr[2] = 20;
    arr.print();

    // 获取数组大小
    std::cout << "Array size: " << arr.arraysize() << std::endl;

    // 尝试访问越界元素
    try {
        std::cout << arr[5] << std::endl; // 这将抛出异常
    } catch (const std::out_of_range& e) {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}
  1. 模板声明

    • template <class T, std::size_t N>:这个类模板接受两个参数:一个类型参数T和一个非类型模板参数N,表示数组的大小。
  2. 成员函数

    • constexpr std::size_t arraysize() const:返回数组的大小,使用constexpr保证在编译时常量。
    • T& operator[](std::size_t index)const T& operator[](std::size_t index) const:重载的索引运算符用于访问数组元素,包含边界检查以防止越界访问。
    • void fill(const T& value):填充数组的所有元素为指定的值。
    • void print() const:打印数组内容。
  3. 数据成员

    • T _array[N]:声明一个静态数组作为类的成员,大小为模板参数N
  4. main函数

    • 创建一个StaticArray<int, 5>对象。
    • 使用fill方法填充数组,打印数组内容。
    • 修改数组元素并打印内容。
    • 获取并打印数组大小。
    • 尝试访问越界元素,捕获并处理异常。
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值