模板元编程是 C++ 最具特色的能力之一——利用编译期计算生成类型安全的代码,实现零运行时开销的抽象。

SFINAE:替换失败不是错误

SFINAE 是模板元编程的基石。当模板参数替换失败时,编译器不会报错,而是从重载候选集中移除该模板。

// 检测类型是否具有 size() 方法
template<typename T>
auto has_size_impl(int) -> decltype(std::declval<T>().size(), std::true_type{});
template<typename T>
std::false_type has_size_impl(...);

template<typename T>
constexpr bool has_size = decltype(has_size_impl<T>(0))::value;

类型萃取

标准库的 type_traits 提供了丰富的类型操作工具:条件选择、类型判断、类型转换等。配合 SFINAE,可以在编译期实现精细的类型约束。

变参模板

C++11 引入的变参模板让模板可以接受任意数量的参数,结合折叠表达式,大大简化了代码:

template<typename... Args>
void print(Args&&... args) {
    ((std::cout << args << " "), ...);
}

C++20 Concepts:模板的未来

Concepts 是 C++20 引入的语言级约束机制,让模板错误信息从深奥的数百行变成清晰的几行。它正在逐步取代传统的 SFINAE 技术。

模板元编程的魅力在于:编译器为你写代码。