#include <iostream>
#include <algorithm>
// 模板函数,接收一个数组和数组大小
template<typename T>
void sortArray(T arr[], size_t size) {
// 处理数组作为函数实参时退化为指针的问题,这里通过额外传入大小参数来知晓数组实际元素个数
std::sort(arr, arr + size);
}
int main() {
int intArr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
size_t intSize = sizeof(intArr) / sizeof(intArr[0]);
double doubleArr[] = {3.14, 1.618, 2.718, 0.577};
size_t doubleSize = sizeof(doubleArr) / sizeof(doubleArr[0]);
sortArray(intArr, intSize);
sortArray(doubleArr, doubleSize);
// 输出排序后的数组
std::cout << "Sorted int array: ";
for (size_t i = 0; i < intSize; ++i) {
std::cout << intArr[i] << " ";
}
std::cout << std::endl;
std::cout << "Sorted double array: ";
for (size_t i = 0; i < doubleSize; ++i) {
std::cout << doubleArr[i] << " ";
}
std::cout << std::endl;
return 0;
}
在模板函数中处理这种类型转换需要注意的要点:
- 数组退化为指针:在C++ 中,当数组作为函数参数传递时,会退化为指针。因此,在模板函数中,仅仅通过参数
T arr[]
并不能获取数组的大小,需要额外传递一个参数(如size_t size
)来表示数组的元素个数。
- 类型兼容性:模板函数中的操作要保证对于不同类型的数组元素都是合法的。例如,在上述代码中使用
std::sort
进行排序,要求数组元素类型必须支持比较操作符(如<
)。如果元素类型没有定义合适的比较操作符,需要为该类型重载相应的操作符或者提供自定义的比较函数给std::sort
。
- 模板参数推导:编译器需要能够根据传入的实参推导出模板参数
T
的类型。确保函数调用时传递的数组类型明确,以便编译器能够正确推导。