C++模板的详细用法:
1)函数模板:
函数模板允许你定义一个通用的函数,可以接受不同类型的参数。语法如下:
template <typename T>
T add(T a, T b) {
return a + b;
}
在这个例子中,T是一个占位符类型,可以用任何类型来调用add函数。例如:
int result1 = add<int>(3, 4); // 结果为7
double result2 = add<double>(3.5, 4.5); // 结果为8.0
2)类模板:
类模板允许你定义一个通用的类,可以使用不同类型的对象。语法如下:
template <typename T>
class MyArray {
private:
T* arr;
int size;
public:
MyArray(T* arr, int size) : arr(arr), size(size) {}
T get(int index) {
return arr[index];
}
};
在这个例子中,T是一个占位符类型,可以用任何类型来创建MyArray类的实例。例如:
int arr1[] = {1, 2, 3};
MyArray<int> myArray1(arr1, 3); // 创建一个整型数组对象
double arr2[] = {1.5, 2.5, 3.5};
MyArray<double> myArray2(arr2, 3); // 创建一个双精度浮点型数组对象
3)模板的特化:
模板的特化是一种为特定类型提供模板的特殊实现的方式。语法如下:
template <typename T>
class MyArray {
// ...类定义...
};
// 特化MyArray类,指定T为int类型时的特殊实现
template <>
class MyArray<int> {
// ...特化后的类定义...
};
在这个例子中,当T为int类型时,使用特化后的MyArray类定义。对于其他类型,使用通用的MyArray类定义。
4)模板的参数匹配:
C++17引入了模板的参数匹配功能,允许根据参数类型选择不同的模板实现。语法如下:
template <typename T, typename U>
void print(T t, U u) {
std::cout << "General template" << std::endl;
}
template <typename T>
void print(T t, int i) {
std::cout << "Specialization for int" << std::endl;
}
5)模板别名:使用 using 关键字为模板创建别名。
例如:
template <typename T>
using Vec = std::vector<T>;
6)模板参数默认值:在C++20中,可以为模板参数提供默认值。
例如:
template <typename T = int>
T add(T a, T b) {
return a + b;
}
7)概念(C++20引入):概念是一种用于模板元编程的新工具,它允许你定义模板参数的约束。
例如:
template <typename T>
concept Sortable = requires(T t) {
{ t.sort() } -> void;
};
8)模块(C++20引入):模块是一种封装和组织代码的新方式,它可以与模板一起使用。
例如:
在 my_module.hpp 文件中定义模块:
export module my_module;
export template <typename T> void print(T t) { std::cout << t << std::endl; }
在另一个文件中使用模块:
``import my_module; // 导入模块my_module中的所有内容。可以使用print函数了。`