模板的进阶应用
模板特化与偏特化
模板特化允许为特定类型提供定制化的实现。全特化针对所有模板参数,偏特化针对部分模板参数。全特化示例:
template <typename T>
class MyClass {
public:
void print() { cout << "General template" << endl; }
};
template <>
class MyClass<int> {
public:
void print() { cout << "Specialized for int" << endl; }
};
偏特化示例:
template <typename T, typename U>
class MyPair {
public:
void print() { cout << "General pair" << endl; }
};
template <typename U>
class MyPair<int, U> {
public:
void print() { cout << "Partial specialization for int" << endl; }
};
可变参数模板
可变参数模板允许接受任意数量的模板参数,常用于递归展开或折叠表达式处理:
template <typename... Args>
void printAll(Args... args) {
(cout << ... << args) << endl; // 折叠表达式(C++17)
}
SFINAE与类型萃取
SFINAE(替换失败不是错误)用于在编译期选择模板重载,结合std::enable_if或std::void_t实现条件编译:
template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void process(T value) {
cout << "Integral type: " << value << endl;
}
类型萃取(Type Traits)通过<type_traits>库检查或修改类型特性:
static_assert(std::is_same_v<int, std::remove_const_t<const int>>);
模板元编程
编译期计算通过模板递归和特化实现,例如计算阶乘:
template <int N>
struct Factorial {
static constexpr int value = N * Factorial<N - 1>::value;
};
template <>
struct Factorial<0> {
static constexpr int value = 1;
};
模板与CRTP
奇异递归模板模式(CRTP)通过基类模板派生实现静态多态:
template <typename Derived>
class Base {
public:
void interface() {
static_cast<Derived*>(this)->implementation();
}
};
class Derived : public Base<Derived> {
public:
void implementation() { cout << "Derived impl" << endl; }
};
模板的编译期优化
constexpr和if constexpr(C++17)增强编译期逻辑处理能力:
template <typename T>
auto getValue(T t) {
if constexpr (std::is_pointer_v<T>) {
return *t;
} else {
return t;
}
}
模板的别名与缩写
使用using定义模板别名简化复杂类型:
template <typename T>
using Vec = std::vector<T, MyAllocator<T>>;
模板的友元与ADL
模板类中声明友元函数时需注意参数依赖查找(ADL):
template <typename T>
class Box {
T value;
friend void peek(const Box<T>& box) {
cout << box.value << endl;
}
};
C++模板特化与偏特化详解
384

被折叠的 条评论
为什么被折叠?



