[ PROMPT_NODE_24602 ]
Cpp Pro 模板
[ SKILL_DOCUMENTATION ]
# 模板元编程
## 变参模板
cpp
#include
#include
// 折叠表达式 (C++17)
template
auto sum(Args... args) {
return (args + ...); // 一元右折叠
}
template
void print(Args&&... args) {
((std::cout << args << ' '), ...); // 二元左折叠
std::cout << 'n';
}
// 递归变参模板
template
void log(T&& value) {
std::cout << value << 'n';
}
template
void log(T&& first, Args&&... rest) {
std::cout << first << ", ";
log(std::forward(rest)...);
}
// 参数包展开
template
struct TypeList {
static constexpr size_t size = sizeof...(Types);
};
template
auto make_tuple_advanced(Args&&... args) {
return std::tuple<std::decay_t...>(std::forward(args)...);
}
## SFINAE 与 if constexpr
cpp
#include
// 使用 std::enable_if 的 SFINAE (旧式)
template
std::enable_if_t<std::is_integral_v, T>
double_value(T value) {
return value * 2;
}
template
std::enable_if_t<std::is_floating_point_v, T>
double_value(T value) {
return value * 2.0;
}
// 现代: if constexpr (C++17)
template
auto process(T value) {
if constexpr (std::is_integral_v) {
return value * 2;
} else if constexpr (std::is_floating_point_v) {
return value * 2.0;
} else {
return value;
}
}
// 检测惯用法
template
struct has_serialize : std::false_type {};
template
struct has_serialize<T, std::void_t<decltype(std::declval().serialize())>>
: std::true_type {};
template
constexpr bool has_serialize_v = has_serialize::value;
// 与 if constexpr 配合使用
template
void save(const T& obj) {
if constexpr (has_serialize_v) {
obj.serialize();
} else {
// 默认序列化
}
}
## 类型萃取 (Type Traits)
cpp
#include
// 自定义类型萃取
template
struct remove_all_pointers {
using type = T;
};
template
struct remove_all_pointers {
using type = typename remove_all_pointers::type;
};
template
using remove_all_pointers_t = typename remove_all_pointers::type;
// 条件类型
template
struct conditional_type {
using type = T;
};
template