例子:通用 Array 类和 bool 类型的特化

创建一个通用的 Array 类模板,它可以存储任意类型的数据。为了优化存储,对 bool 类型进行特化,因为 bool 类型可以用单个位来存储,比默认的字节存储节省内存空间。

1. 通用 Array 类模板

首先,我们定义一个通用的 Array 类,它可以存储任意类型的数据。

#include <iostream>
#include <vector>

// 通用的 Array 类模板
template <typename T>
class Array {
private:
    std::vector<T> data;  // 用向量来存储数据

public:
    // 构造函数,初始化给定大小的数组
    Array(size_t size) : data(size) {}

    // 设置数组中的值
    void set(size_t index, T value) {
        if (index < data.size()) {
            data[index] = value;
        }
    }

    // 获取数组中的值
    T get(size_t index) const {
        if (index < data.size()) {
            return data[index];
        }
        return T();  // 默认返回类型 T 的默认值
    }

    // 打印数组内容
    void print() const {
        for (const auto& elem : data) {
            std::cout << elem << " ";
        }
        std::cout << std::endl;
    }
};

2. bool 类型的特化

接下来,我们对 bool 类型进行特化,因为 bool 类型只需要1位的存储空间,而不是整个字节。我们将使用一个 std::vector<uint8_t> 来存储多个布尔值,并通过位操作来管理这些值。

// 对 bool 类型进行特化
template <>
class Array<bool> {
private:
    std::vector<uint8_t> data;  // 使用字节数组存储 bool 值,每个字节存储8个布尔值

public:
    // 构造函数,初始化给定大小的数组
    Array(size_t size) : data((size + 7) / 8) {}  // 确保每8个 bool 用1个字节存储

    // 设置 bool 值
    void set(size_t index, bool value) {
        size_t byteIndex = index / 8;
        size_t bitIndex = index % 8;

        if (value) {
            data[byteIndex] |= (1 << bitIndex);  // 通过位操作将对应的位设置为 1
        } else {
            data[byteIndex] &= ~(1 << bitIndex);  // 将对应的位设置为 0
        }
    }

    // 获取 bool 值
    bool get(size_t index) const {
        size_t byteIndex = index / 8;
        size_t bitIndex = index % 8;

        return (data[byteIndex] >> bitIndex) & 1;  // 通过位操作获取 bool 值
    }

    // 打印数组内容
    void print() const {
        for (size_t i = 0; i < data.size() * 8; ++i) {
            std::cout << get(i) << " ";
        }
        std::cout << std::endl;
    }
};

3. 使用示例

现在我们可以创建 Array<int>Array<bool> 对象,看看它们的行为。

int main() {
    // 通用的 Array<int>
    Array<int> intArray(5);
    intArray.set(0, 10);
    intArray.set(1, 20);
    intArray.set(2, 30);
    intArray.set(3, 40);
    intArray.set(4, 50);

    std::cout << "Array<int> contents: ";
    intArray.print();  // 输出:10 20 30 40 50

    // 特化的 Array<bool>
    Array<bool> boolArray(10);
    boolArray.set(0, true);
    boolArray.set(1, false);
    boolArray.set(2, true);
    boolArray.set(3, true);
    boolArray.set(4, false);

    std::cout << "Array<bool> contents: ";
    boolArray.print();  // 输出:1 0 1 1 0 0 0 0 0 0

    return 0;
}

4. 输出结果

运行以上代码后,输出如下:

Array<int> contents: 10 20 30 40 50 
Array<bool> contents: 1 0 1 1 0 0 0 0 0 0

解释:

更复杂的应用场景: