CodeWalk

模板元编程基础与实践应用

作者:小字辈 · 2026-05-30 12:55

请介绍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处理类型级操作。