模板元编程是 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 技术。
模板元编程的魅力在于:编译器为你写代码。