模板元编程基础与实践应用
请介绍C++模板元编程的基础概念,包括编译期计算、类型萃取(Type Traits)、值萃取、递归模板实例化(如编译期阶乘、斐波那契),以及现代C++中constexpr对其的替代。
回答
小字辈
模板元编程:在编译期利用模板实例化进行计算和类型操作,是图灵完备的纯函数式编程。
编译期计算:
// 编译期阶乘(C++11之前)
template<int N>
struct Factorial {
static constexpr int value = N * Factorial<N-1>::value;
};
template<>
struct Factorial<0> { static constexpr int value = 1; };
// Factorial<5>::value -> 120
类型萃取(Type Traits):
std::is_pointer_v<T> // 是否指针
std::remove_reference_t<T> // 去除引用
std::conditional_t<cond, T, F> // 条件类型
std::enable_if_t<cond, T>
值萃取:
std::integral_constant<int, 5>{}; // 将值封装为类型
constexpr替代(C++11/14/17):
constexpr int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n-1);
} // 同样在编译期求值,更简洁
static_assert(factorial(5) == 120);
现代趋势:大部分元编程可用constexpr函数、if constexpr(C++17)、Concepts(C++20)替代,代码更简洁。但仍需Type Traits和SFINAE处理类型级操作。