C++模板元编程面试必考:从入门到精通全解析,面试官都夸专业!
本文是C++面试系列的第N篇,专注模板元编程(Template Metaprogramming, TMP)。这是C++中最强大也最让人头疼的特性之一,大厂面试高频考点,90%的候选人说不清楚SFINAE和完美转发的底层原理。
一、什么是模板元编程?
模板元编程是在编译期执行计算的编程范式。简单来说,就是把运行时的工作提前到编译期完成,用编译器当“计算器”。
// 编译期计算阶乘template<intN>structFactorial{staticconstexprintvalue=N*Factorial<N-1>::value;};template<>structFactorial<0>{staticconstexprintvalue=1;};// 使用intmain(){constexprintresult=Factorial<10>::value;std::cout<<result<<std::endl;return0;}为什么面试爱考这个?因为模板元编程体现了C++“零成本抽象”的核心哲学——STL、现代框架的底层都大量使用TMP。
二、模板基础回顾:三种模板形式
2.1 函数模板
template<typenameT>Tmax_value(T a,T b){return(a>b)?a:b;}max_value(3,5);// T = intmax_value(3.14,2.71);// T = double2.2 类模板
template<typenameT,intSize>classFixedArray{T data[Size];intcount=0;public:voidpush(constT&val){if(count<Size)data[count++]=val;}Tget(intidx)const{returndata[idx];}intsize()const{returncount;}};FixedArray<int,100>arr;arr.push(42);2.3 变量模板(C++14)
template<typenameT>constexprT pi=T(3.14159265358979323846);doubled=pi<double>;floatf=pi<float>;三、特化与偏特化:模板的“if-else”
面试高频题:全特化和偏特化有什么区别?
template<typenameT,typenameU>structIsSame{staticconstexprboolvalue=false;};template<typenameT>structIsSame<T,T>{staticconstexprboolvalue=true;}