例子:通用 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
解释:
- 通用模板
Array<int>
:我们使用std::vector<int>
来存储整数数组。set()
和get()
方法直接操作数组中的整数值。 - 特化模板
Array<bool>
:我们使用std::vector<uint8_t>
来存储布尔值,每个字节可以存储 8 个布尔值。set()
和get()
方法通过位操作来设置和获取特定位上的布尔值。这大大节省了内存,因为每个布尔值只占用 1 位,而不是 1 字节。
更复杂的应用场景:
- 内存优化:通过对特定类型(如
bool
)的模板特化,我们可以在不改变外部接口的前提下优化内存的使用。这种技术在涉及大量小数据类型时非常有用。 - 性能优化:特化还可以用于性能优化。对某些类型使用特化的模板,可以提供更高效的操作(如加速矩阵运算或特殊的内存对齐策略)。