侯捷 C++ 课程学习笔记:Member Template(成员模板)

个人简介
在这里插入图片描述
作者简介:全栈研发,具备端到端系统落地能力,专注大模型的压缩部署、多模态理解与 Agent 架构设计。 热爱“结构”与“秩序”,相信复杂系统背后总有简洁可控的可能。
我叫观熵。不是在控熵,就是在观测熵的流动
个人主页:观熵
个人邮箱:privatexxxx@163.com
座右铭:愿科技之光,不止照亮智能,也照亮人心!

专栏导航

观熵系列专栏导航:
AI前沿探索:从大模型进化、多模态交互、AIGC内容生成,到AI在行业中的落地应用,我们将深入剖析最前沿的AI技术,分享实用的开发经验,并探讨AI未来的发展趋势
AI开源框架实战:面向 AI 工程师的大模型框架实战指南,覆盖训练、推理、部署与评估的全链路最佳实践
计算机视觉:聚焦计算机视觉前沿技术,涵盖图像识别、目标检测、自动驾驶、医疗影像等领域的最新进展和应用案例
国产大模型部署实战:持续更新的国产开源大模型部署实战教程,覆盖从 模型选型 → 环境配置 → 本地推理 → API封装 → 高性能部署 → 多模型管理 的完整全流程
TensorFlow 全栈实战:从建模到部署:覆盖模型构建、训练优化、跨平台部署与工程交付,帮助开发者掌握从原型到上线的完整 AI 开发流程
PyTorch 全栈实战专栏: PyTorch 框架的全栈实战应用,涵盖从模型训练、优化、部署到维护的完整流程
深入理解 TensorRT:深入解析 TensorRT 的核心机制与部署实践,助力构建高性能 AI 推理系统
Megatron-LM 实战笔记:聚焦于 Megatron-LM 框架的实战应用,涵盖从预训练、微调到部署的全流程
AI Agent:系统学习并亲手构建一个完整的 AI Agent 系统,从基础理论、算法实战、框架应用,到私有部署、多端集成
DeepSeek 实战与解析:聚焦 DeepSeek 系列模型原理解析与实战应用,涵盖部署、推理、微调与多场景集成,助你高效上手国产大模型
端侧大模型:聚焦大模型在移动设备上的部署与优化,探索端侧智能的实现路径
行业大模型 · 数据全流程指南:大模型预训练数据的设计、采集、清洗与合规治理,聚焦行业场景,从需求定义到数据闭环,帮助您构建专属的智能数据基座
机器人研发全栈进阶指南:从ROS到AI智能控制:机器人系统架构、感知建图、路径规划、控制系统、AI智能决策、系统集成等核心能力模块
人工智能下的网络安全:通过实战案例和系统化方法,帮助开发者和安全工程师识别风险、构建防御机制,确保 AI 系统的稳定与安全
智能 DevOps 工厂:AI 驱动的持续交付实践:构建以 AI 为核心的智能 DevOps 平台,涵盖从 CI/CD 流水线、AIOps、MLOps 到 DevSecOps 的全流程实践。
C++学习笔记?:聚焦于现代 C++ 编程的核心概念与实践,涵盖 STL 源码剖析、内存管理、模板元编程等关键技术
AI × Quant 系统化落地实战:从数据、策略到实盘,打造全栈智能量化交易系统


侯捷 C++ 课程学习笔记:Member Template(成员模板)

1. 引言

在 C++ 模板编程中,成员模板(Member Template) 允许我们在 非模板类模板类 内定义泛型成员函数,使得类的部分功能可以适用于不同类型。

侯捷老师的 C++ 课程深入讲解了 成员模板的概念、在非模板类与模板类中的应用、成员模板与友元、结合 STL 进行开发 等内容。

本博客将围绕 成员模板的基础概念、常见应用、最佳实践,并提供实际开发中的详细示例。


2. 什么是成员模板?

2.1 成员模板的基本概念

成员模板(Member Template) 指的是 类的成员函数可以是模板函数,即:

  • 非模板类 也可以有 模板成员函数
  • 模板类 可以有 不同模板参数的成员模板

2.2 成员模板的基本语法

template <typename T>
class MyClass {
public:
    template <typename U>  // 成员模板
    void func(U value) {
        std::cout << "Value: " << value << std::endl;
    }
};

示例:非模板类中的成员模板

#include <iostream>
class Demo {
public:
    template <typename T>
    void print(T value) {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    Demo obj;
    obj.print(42);        // int
    obj.print(3.14);      // double
    obj.print("Hello");  // const char*
    return 0;
}

输出:

Value: 42
Value: 3.14
Value: Hello

特点:

  • Demo::print<T> 适用于任意数据类型
  • 成员模板使得非模板类可以具有泛型能力

3. 在模板类中使用成员模板

3.1 模板类中的成员模板

类模板 中,成员模板可以使用 不同的模板参数

template <typename T>
class Box {
private:
    T value;
public:
    Box(T val) : value(val) {}
    
    template <typename U>
    void print(U extra) {
        std::cout << "Stored: " << value << " | Extra: " << extra << std::endl;
    }
};

示例:

int main() {
    Box<int> intBox(100);
    intBox.print("Additional Data"); // 存储 int,输出字符串
    return 0;
}

输出:

Stored: 100 | Extra: Additional Data

说明:

  • Box<int> 存储 int,但 print<U> 可以接受 不同类型 的参数。
  • 成员模板比单一类型的成员函数更灵活。

4. 成员模板与友元(Friend)

4.1 友元成员模板

成员模板可以声明为 友元函数,允许不同实例间的访问。

template <typename T>
class Data {
private:
    T value;
public:
    Data(T v) : value(v) {}
    
    template <typename U>
    friend void show(const Data<U>& obj); // 友元成员模板
};

template <typename U>
void show(const Data<U>& obj) {
    std::cout << "Data: " << obj.value << std::endl;
}

示例:

int main() {
    Data<int> d1(10);
    show(d1); // 访问 private 成员
    return 0;
}

输出:

Data: 10

说明:

  • show<U> 作为友元成员模板,可访问 Data<U> 的私有成员。
  • 适用于 不同类型实例的交互(如 Data<int>Data<double>)。

5. 成员模板在 STL(标准模板库)中的应用

5.1 std::vectorassign() 方法

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec;
    vec.assign({1, 2, 3, 4}); // 成员模板支持不同类型的容器赋值
    for (int n : vec) {
        std::cout << n << " ";
    }
    return 0;
}

输出:

1 2 3 4

5.2 std::mapinsert() 方法

#include <map>
#include <iostream>

int main() {
    std::map<std::string, int> ages;
    ages.insert({"Alice", 25});
    ages.insert(std::pair<std::string, int>("Bob", 30));
    for (auto &pair : ages) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

输出:

Alice: 25
Bob: 30

特点:

  • assign()insert() 是 STL 容器的成员模板函数,支持不同类型的数据。

6. 结论

  1. 成员模板 允许非模板类和模板类都可以有泛型成员函数
  2. 在模板类中,成员模板可以使用不同的类型参数,提高灵活性。
  3. 成员模板与友元结合,可用于不同模板实例之间的访问。
  4. STL 容器广泛使用成员模板(如 vector::assign()map::insert())。

通过本笔记,我们深入理解了 成员模板的基本概念、在模板类与非模板类中的应用、成员模板的最佳实践,这些技术在STL 设计、泛型编程、高效 C++ 代码编写中具有重要作用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

观熵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值