编写编程实例的模板通常涉及以下步骤:
定义模板
使用`template`关键字来定义模板,并指定模板参数。模板参数可以是类型、整型常量等。例如,定义一个简单的动态数组模板类:
```cpp
template class DynamicArray { private: T* data; // 动态数组指针 size_t size; // 当前数组大小 size_t capacity; // 数组容量 // 扩容函数 void resize() { capacity *= 2; T* new_data = new T[capacity]; for (size_t i = 0; i < size; ++i) { new_data[i] = data[i]; } delete[] data; data = new_data; } public: DynamicArray(size_t initial_capacity = 10) : size(0), capacity(initial_capacity) { data = new T[capacity]; } ~DynamicArray() { delete[] data; } void push_back(const T& item) { if (size == capacity) { resize(); } data[size++] = item; } T& operator[](int i) { return data[i]; } const T& operator[](int i) const { return data[i]; } size_t getSize() const { return size; } }; ``` 在主函数或其他代码中,可以通过指定模板参数来使用模板类或函数。例如,使用上述`DynamicArray`模板类: ```cpp int main() { DynamicArray intArray.push_back(1); intArray.push_back(2); intArray.push_back(3); for (size_t i = 0; i < intArray.getSize(); ++i) { std::cout << intArray[i] << " "; } std::cout << std::endl; return 0; } ``` 如果需要对特定类型进行特殊处理,可以使用模板特化或偏特化。例如,为`std::string`类型特化`DynamicArray`: ```cpp template <> class DynamicArray private: std::string* data; size_t size; size_t capacity; void resize() { capacity *= 2; std::string* new_data = new std::string[capacity]; for (size_t i = 0; i < size; ++i) { new_data[i] = data[i]; } delete[] data; data = new_data; } public: DynamicArray(size_t initial_capacity = 10) : size(0), capacity(initial_capacity) { data = new std::string[capacity]; } ~DynamicArray() { delete[] data; } void push_back(const std::string& item) { if (size == capacity) { resize(); } data[size++] = item; } std::string& operator[](int i) { return data[i]; } const std::string& operator[](int i) const { return data[i]; } size_t getSize() const { return size; } }; ``` C++11引入了类型推导,可以使用`auto`关键字来自动推导模板参数的类型。例如:使用模板
模板特化和偏特化
类型推导