写一个有两个模板参数的类模板例子,并给出其局部特化一个模板参数的例子
时间: 2023-11-28 19:49:23 浏览: 34
下面是一个有两个模板参数的类模板例子,其中T和U分别代表两个类型参数:
```c++
template<typename T, typename U>
class Pair {
public:
Pair(const T& t, const U& u) : first(t), second(u) {}
T first;
U second;
};
```
这个类模板定义了一个名为Pair的类,代表一对值。其中first和second分别代表这对值的第一个和第二个元素,它们的类型分别为T和U。
下面是一个局部特化其中一个模板参数的例子,将U固定为int类型:
```c++
template<typename T>
class Pair<T, int> {
public:
Pair(const T& t, const int& u) : first(t), second(u) {}
T first;
int second;
};
```
这个类模板的局部特化将第二个模板参数U固定为int类型,这意味着只有Pair<T, int>这样的实例会被特化。在这个特化版本中,第二个元素的类型被固定为int类型,而第一个元素的类型仍然是T类型。
相关问题
写一个类模板的例子,并给出其具备特化的例子
一个类模板是一种通用的类,可以用来创建多个具有相似行为和属性的对象。下面是一个简单的类模板的例子:
```c++
template<typename T>
class Array {
private:
T* arr;
int size;
public:
Array() {
arr = new T[10];
size = 10;
}
Array(int n) {
arr = new T[n];
size = n;
}
void set(int index, T value) {
if(index >= 0 && index < size) {
arr[index] = value;
}
}
T get(int index) {
if(index >= 0 && index < size) {
return arr[index];
}
return T();
}
~Array() {
delete[] arr;
}
};
```
这个类模板可以用来创建数组对象,其中模板参数T表示数组元素的类型。比如,我们可以创建一个Array<int>类型的对象来表示整数数组:
```c++
Array<int> intArr(5);
intArr.set(0, 1);
intArr.set(1, 2);
intArr.set(2, 3);
intArr.set(3, 4);
intArr.set(4, 5);
for(int i=0; i<5; i++) {
cout << intArr.get(i) << " ";
}
// 输出:1 2 3 4 5
```
我们还可以创建一个Array<double>类型的对象来表示双精度浮点数数组:
```c++
Array<double> doubleArr(3);
doubleArr.set(0, 1.1);
doubleArr.set(1, 2.2);
doubleArr.set(2, 3.3);
for(int i=0; i<3; i++) {
cout << doubleArr.get(i) << " ";
}
// 输出:1.1 2.2 3.3
```
我们还可以对这个类模板进行特化,以便为特定的类型提供自定义实现。例如,我们可以创建一个Array<bool>类型的特化,其中set和get方法的实现方式与普通的Array不同:
```c++
template<>
class Array<bool> {
private:
bool* arr;
int size;
public:
Array() {
arr = new bool[10];
size = 10;
}
Array(int n) {
arr = new bool[n];
size = n;
}
void set(int index, bool value) {
if(index >= 0 && index < size) {
arr[index] = value;
}
}
bool get(int index) {
if(index >= 0 && index < size) {
return arr[index];
}
return false;
}
~Array() {
delete[] arr;
}
};
```
这个特化版本的Array类模板可以用来创建bool类型的数组对象:
```c++
Array<bool> boolArr(4);
boolArr.set(0, true);
boolArr.set(1, false);
boolArr.set(2, true);
boolArr.set(3, false);
for(int i=0; i<4; i++) {
cout << boolArr.get(i) << " ";
}
// 输出:1 0 1 0
```
写一个C++函数模板偏特化的例子
下面是一个简单的 C++ 函数模板偏特化的示例,它将模板函数按照参数类型进行特化:
```c++
#include <iostream>
using namespace std;
template <typename T>
void print(T t) {
cout << "General print: " << t << endl;
}
template <>
void print<int>(int t) {
cout << "Specialized print for int: " << t << endl;
}
int main() {
print("Hello");
print(123);
return 0;
}
```
在上面的示例中,我们定义了一个模板函数 `print()`,并在其中使用了模板参数 `T`。接下来,我们定义了一个特化版本,它针对 `int` 参数进行特化,输出一个定制的消息。在 `main()` 函数中,我们分别调用了两个版本的 `print()` 函数。
输出结果如下:
```
General print: Hello
Specialized print for int: 123
```