面试题答案
一键面试C++函数模板全特化与代码复用性的关系
- 全特化定义:函数模板全特化是针对特定类型提供的模板的完全特化版本,它为特定类型提供定制化的实现。
- 与代码复用性的关系:
- 降低代码复用性场景:当全特化实现与通用模板实现差异极大,几乎没有共用的代码逻辑时,会降低代码复用性。比如通用模板实现对所有类型进行简单加法操作,但对
std::string
类型全特化时,需要进行字符串拼接,其实现逻辑与通用模板的加法逻辑完全不同,无法复用通用模板代码。 - 提高代码复用性场景:当对某些特定类型有特殊优化需求,但整体功能仍基于通用模板的核心逻辑时,全特化可以提高代码复用性。例如通用模板对各种数值类型进行排序,对于
int
类型,利用快速排序算法全特化实现,相比通用模板的冒泡排序,在int
类型上性能更优,但排序的基本概念仍复用了通用模板。
- 降低代码复用性场景:当全特化实现与通用模板实现差异极大,几乎没有共用的代码逻辑时,会降低代码复用性。比如通用模板实现对所有类型进行简单加法操作,但对
降低代码复用性的场景示例
// 通用模板
template <typename T>
T add(T a, T b) {
return a + b;
}
// 对std::string的全特化
template <>
std::string add<std::string>(std::string a, std::string b) {
return a.append(b);
}
这里通用模板的加法逻辑无法复用到std::string
的拼接实现,降低了代码复用性。
提高代码复用性的场景示例
// 通用模板,冒泡排序
template <typename T>
void sortArray(T arr[], int size) {
for (int i = 0; i < size - 1; ++i) {
for (int j = 0; j < size - i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
T temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 对int类型的全特化,快速排序
template <>
void sortArray<int>(int arr[], int size) {
// 快速排序实现,这里省略具体代码
// 虽然实现不同,但核心排序概念复用通用模板
}
这里int
类型全特化版本在利用不同排序算法时,复用了通用模板的排序概念,提高了代码复用性。