C++ 模板元编程系列专题 3:模板偏特化

本文深入探讨C++模板元编程中的模板全特化和偏特化概念。全特化是指使用`template <>`为空模板参数提供特定实现,而偏特化则是模板参数不完全特化的形式,用于针对特定类型组合定制实现。通过模板实例化,函数模板和类模板能够生成实际的函数或类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、模板 + 全特化
模板,代表了一种泛化的语义。显然,既然有泛化语义,就应当有特化语义。特化,使得我们能为某些特定的类型专门提供一份特殊实现,以达到某些目的。特化分为全特化与偏特化。所谓全特化,即一个“披着空空如也的template <>的普通函数或类”

#include <iostream>
#include <iomanip>
#include <string>
#include <random>
#include <chrono>
#include <any>

// 标准函数模板
template <typename T>
void Plus(T lv, T rv) {
    std::cout << (lv + rv) << "\n";
}

// 全特化版本:当 T 为 int 时,将优先使用此定义
template <>  
void Plus(int lv, int rv) {
    std::cout << (lv * rv) << "\n";
}

int main() {
    Plus(1., 2.);  // 使用泛型版本,输出结果 3
    Plus(1, 2);    // 使用特化版本,输出结果 2
}

2、模板 + 偏特化
偏特化又是什么呢?除了全特化以外的特化,都称为偏特化。从写法上来看,template关键词之后的“<>”不能为空,否则就是全特化。

#include <iostream>
#include <iomanip>
#include <string>
#include <random>
#include <chrono>
#include <any>

// 泛化版本
template <typename T, typename U>
class Entity {
public:
    void Add(T lv, U lr) {
        std::cout << (lv + lr) << "\n";
    }
};


// 偏特化版本1:仅当两个类型一样的时候,才会且一定会使用此版本
template <typename T>
class Entity <T, T> {
public:
    void Add(T lv, T lr) {
        std::cout << (lv + lr) << "\n";
    }
};


// 偏特化版本2:仅当两个类型都是指针的时候,才会且一定会使用此版本
template <typename T, typename U>
class Entity <T*, U*> {
public:
    void Add(T* plv, U* prv) {
        std::cout << (*plv + *prv) << "\n";
    }
};

int main() {
    Entity<int, int>().Add(1, 2);  // 输出结果 3
    Entity<int, long>().Add(2, 3.0);  // 输出结果 5
    int a = 10;
    long b = 20;
    Entity<int*, long*>().Add(&a, &b);  // 输出结果 30
}

函数模板不是函数,而是一个可以生成函数的语法组分;同理,类模板也不是类,而是一个可以生成类的语法组分。我们称通过函数模板生成函数,或通过类模板生成类的过程为模板实例化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由技艺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值