如何提前声明模板可用类型,限制类型
时间: 2024-03-09 17:49:06 浏览: 13
您可以使用模板特化来提前声明模板可用类型,以及限制类型。模板特化是在模板参数满足特定条件时,为该特定条件提供一个单独的实现。例如,假设您有以下类模板:
```cpp
template<typename T>
class MyClass {
public:
void foo() {
T::iterator it; // 使用 T 中的 iterator
// 使用 it 迭代器
}
};
```
如果您想限制 `T` 只能是 STL 容器类型,则可以使用模板特化来实现:
```cpp
#include <vector>
#include <list>
#include <deque>
template<typename T>
class MyClass {
public:
void foo() {
T::iterator it; // 使用 T 中的 iterator
// 使用 it 迭代器
}
};
// 模板特化,限制 T 只能是 STL 容器类型
template<typename T>
class MyClass<std::vector<T>> {
public:
void foo() {
typename std::vector<T>::iterator it; // 使用 std::vector<T> 中的 iterator
// 使用 it 迭代器
}
};
template<typename T>
class MyClass<std::list<T>> {
public:
void foo() {
typename std::list<T>::iterator it; // 使用 std::list<T> 中的 iterator
// 使用 it 迭代器
}
};
template<typename T>
class MyClass<std::deque<T>> {
public:
void foo() {
typename std::deque<T>::iterator it; // 使用 std::deque<T> 中的 iterator
// 使用 it 迭代器
}
};
```
在上面的示例中,我们为 `std::vector<T>`、`std::list<T>` 和 `std::deque<T>` 分别提供了一个模板特化的实现。在这些特化实现中,我们使用 `typename` 关键字来告诉编译器 `T::iterator` 是一个类型。这样,当 `MyClass` 被实例化为 `MyClass<std::vector<int>>`、`MyClass<std::list<int>>` 或 `MyClass<std::deque<int>>` 时,它将使用对应的模板特化实现,而不是通用的实现。