C++模板特化与偏特化精要

C++模板特化与偏特化详解

模板的进阶应用

模板特化与偏特化

模板特化允许为特定类型提供定制化的实现。全特化针对所有模板参数,偏特化针对部分模板参数。全特化示例:

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_ifstd::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; }
};

模板的编译期优化

constexprif 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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值