面试题答案
一键面试函数模板实现
#include <iostream>
#include <vector>
#include <list>
template <typename T>
void printContainer(const T& container) {
for (const auto& element : container) {
std::cout << element << " ";
}
std::cout << std::endl;
}
类型参数推导过程
- 容器元素类型推导:在
printContainer
函数模板中,通过范围for
循环中的auto
关键字,编译器根据容器中实际存储的元素类型来推导element
的类型。例如,如果传入一个std::vector<int>
,编译器推导element
的类型为int
。 - 容器类型推导:当调用
printContainer
函数时,编译器根据传入的实参类型来推导模板参数T
。如果传入std::vector<int>
,则T
被推导为std::vector<int>
。同样,如果传入std::list<double>
,T
被推导为std::list<double>
。
自定义类型及多构造函数的影响
如果容器是自定义类型且有多个构造函数,这并不会直接影响 printContainer
函数模板的类型参数推导。编译器仍然根据传入的自定义类型容器实例来推导 T
。然而,在使用自定义类型时,编译器需要确保自定义类型有合适的拷贝构造函数或移动构造函数,以便在函数模板内部对容器进行操作(如范围 for
循环中对元素的访问)。同时,如果自定义类型的构造函数涉及复杂的初始化逻辑,在实例化容器时可能需要确保提供正确的参数,以保证容器能够正确构造并存储元素。但这并不影响 printContainer
函数模板本身的类型推导机制。