面试题答案
一键面试1. 函数模板全特化示例
假设我们有一个自定义的多层嵌套链表结构,如下所示:
// 定义链表节点
template<typename T>
struct NestedListNode {
T data;
std::vector<NestedListNode<T>*> children;
NestedListNode(const T& d) : data(d) {}
};
// 普通函数模板
template<typename Container>
void traverseAndPrint(const Container& cont) {
for(const auto& element : cont) {
std::cout << element << " ";
}
std::cout << std::endl;
}
// 全特化函数模板,用于处理自定义的多层嵌套链表结构
template<>
void traverseAndPrint<NestedListNode<int>*>(const NestedListNode<int>* root) {
std::stack<const NestedListNode<int>*> s;
s.push(root);
while (!s.empty()) {
const NestedListNode<int>* node = s.top();
s.pop();
std::cout << node->data << " ";
for (auto it = node->children.rbegin(); it != node->children.rend(); ++it) {
s.push(*it);
}
}
std::cout << std::endl;
}
2. 维护和扩展方面可能面临的问题
- 维护问题:
- 代码冗余:全特化函数模板针对特定类型完全重写实现,与通用函数模板的代码完全分离。如果通用模板有一些基本的修改(如添加日志记录、改变输出格式等),在全特化版本中可能需要手动同步这些修改,增加维护成本。
- 可读性降低:全特化版本通常是针对复杂结构,其实现往往比通用模板更复杂。当代码库规模变大,不同的全特化版本会使代码结构变得混乱,降低代码整体的可读性,给新加入的开发者理解代码带来困难。
- 扩展问题:
- 扩展性受限:如果自定义复杂数据结构发生变化(如嵌套链表中增加新的成员变量、改变遍历逻辑等),全特化函数模板需要相应地进行修改。这可能需要深入了解该全特化函数模板的实现细节,若处理不当,可能会引入新的错误。同时,如果有新的类似复杂数据结构需要处理,可能又需要重新编写一个全新的全特化版本,代码扩展性较差。
- 类型耦合:全特化版本紧密耦合于特定的自定义数据结构类型。如果数据结构的类型体系发生变化(如基类的改变、继承关系调整等),全特化函数模板可能无法正常工作,需要进行全面的修改。