C++ 模板与泛型编程面试题
1. 什么是模板?模板的作用是什么?
答案:
- 模板定义泛型编程的基础编译时生成具体类型的代码提高代码复用性
- 模板类型函数模板:template<typename T> T max(T a, T b);类模板:template<typename T> class Vector {};变量模板(C++14):template<typename T> T pi = T(3.14);
- 优势类型安全代码复用性能好(编译时展开,无运行时开销)
- 缺点编译时间长代码膨胀错误信息复杂
2. typename和class在模板中的区别?
答案:
- 作为模板参数基本没有区别:template<typename T> 等价于 template<class T>都表示类型参数typename更清晰,推荐使用
- typename的特殊用法指明依赖类型名:typename T::value_type告诉编译器这是一个类型而非变量class不能用于这种场景
- 示例
template<typename T>void func() { typename T::iterator it; // 必须用typename}
3. 模板特化和偏特化是什么?
答案:
- 全特化(Full Specialization)为特定类型提供完全不同的实现所有模板参数都确定
template<typename T>class MyClass { };template<>class MyClass<int> { }; // int的特化版本
- 偏特化(Partial Specialization)部分模板参数特化只有类模板支持偏特化
template<typename T, typename U>class MyClass { };template<typename T>class MyClass<T, int> { }; // U特化为int
- 函数模板只支持全特化,不支持偏特化可以用函数重载代替
- 使用场景为特定类型优化性能处理特殊情况类型萃取(type traits)
4. 什么是SFINAE?
答案:
- 定义Substitution Failure Is Not An Error替换失败不是错误模板参数替换失败时,不报错,而是从候选集中移除
- 应用编译期类型检查条件编译实现type traits
- 示例
template<typename T>typename T::value_type func(T t) { } // 只对有value_type的类型有效template<typename T>T func(T t) { }
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.
查看6道真题和解析