当前位置: 首页 > news >正文

第二十一章:模板与继承_《C++ Templates》notes

模板与继承

      • 重点和难点
      • 编译与测试说明
      • 第一部分:多选题 (10题)
      • 第二部分:设计题 (5题)
      • 答案与详解
        • 多选题答案:
        • 设计题参考答案
      • 测试说明

重点和难点

21.1 空基类优化(EBCO)

知识点
空基类优化(Empty Base Class Optimization)允许编译器在派生类中优化空基类的存储空间。若基类没有非静态成员变量、虚函数或虚基类,其大小可被优化为0字节,避免空间浪费。

代码示例

#include <iostream>// 空基类
class EmptyBase {};// 未使用EBCO的类
class NoEBCO {EmptyBase e;int data;
};// 使用EBCO的派生类
class WithEBCO : private EmptyBase {int data;
};int main() {std::cout << "Sizeof(EmptyBase): " << sizeof(EmptyBase) << " bytes\n";std::cout << "Sizeof(NoEBCO): " << sizeof(NoEBCO) << " bytes\n";std::cout << "Sizeof(WithEBCO): " << sizeof(WithEBCO) << " bytes\n";return 0;
}

输出结果

Sizeof(EmptyBase): 1 bytes
Sizeof(NoEBCO): 8 bytes   // 空基类+对齐导致大小增加
Sizeof(WithEBCO): 4 bytes // EBCO优化后仅包含int大小

代码解析

  • EmptyBase是空类,默认大小为1字节(占位符)。
  • NoEBCO包含一个空类成员,由于对齐规则,总大小为int(4) + EmptyBase(1) + 填充(3) = 8字节。
  • WithEBCO通过继承空基类,编译器优化基类存储,总大小仅为int的4字节。

21.2 奇异递归模板模式(CRTP)

知识点
CRTP通过将派生类作为模板参数传递给基类,实现编译时多态。基类可以直接调用派生类的方法,无需虚函数开销。

代码示例

#include <iostream>// CRTP基类模板
template <typename Derived>
class Base {
public:void interface() {static_cast<Derived*>(this)->implementation();}
};// 派生类
class Derived : public Base<Derived> {
public:void implementation() {std::cout << "Derived::implementation() called\n";}
};int main() {Derived d;d.interface(); // 调用基类方法,实际执行派生类实现return 0;
}

输出结果

Derived::implementation() called

代码解析

  • Base模板将Derived作为模板参数,通过static_castthis转为派生类指针。
  • Derived继承Base<Derived>并实现implementation方法。
  • 调用interface()时,基类直接调用派生类的具体实现,无需虚函数表。

21.2.1 Barton-Nackman技巧

知识点
Barton-Nackman技巧结合CRTP和友元函数,在基类中定义运算符,使派生类自动获得运算符支持。

代码示例

#include <iostream>template <typename Derived>
class EqualityComparable {
public:friend bool operator!=(const Derived& lhs, const Derived& rhs) {return !(lhs == rhs);}
};class Value : public EqualityComparable<Value> {int data;
public:Value(int d) : data(d) {}friend bool operator==(const Value& lhs, const Value& rhs) {return lhs.data == rhs.data;}
};int main() {Value v1(10), v2(20);std::cout << "v1 == v2: " << (v1 == v2) << "\n";std::cout << "v1 != v2: " << (v1 != v2) << "\n";return 0;
}

输出结果

v1 == v2: 0
v1 != v2: 1

代码解析

  • EqualityComparable模板提供operator!=,其实现依赖于派生类的operator==
  • Value类继承EqualityComparable<Value>并定义operator==,自动获得operator!=支持。

21.3 Mixins

知识点
Mixins通过模板继承动态组合功能,允许在编译时为类添加特定行为。

代码示例

#include <iostream>// Mixin基类:添加打印功能
template <typename T>
class Printable {
public:void print() const {std::cout << static_cast<const T&>(*this).data << "\n";}
};// 目标类使用Mixin
class MyValue : public Printable<MyValue> {
public:int data;MyValue(int d) : data(d) {}
};int main() {MyValue val(42);val.print(); // 输出:42return 0;
}

输出结果

42

代码解析

  • Printable模板通过CRTP提供print方法,访问派生类的data成员。
  • MyValue继承Printable<MyValue>,获得print功能,无需手动实现。

21.4 命名模板参数

知识点
通过默认模板参数和标签技术,模拟命名参数,提升模板代码可读性。

代码示例

#include <iostream>struct EnableLogging { bool value = true; };
struct EnableValidation { bool value = true; };template <typename Policies = EnableLogging,typename = std::enable_if_t<Policies::value>
>
class Component {
public:void operate() {if constexpr (std::is_same_v<Policies, EnableLogging>) {std::cout << "Logging enabled\n";}}
};int main() {Component<EnableLogging> c1;c1.operate(); // 输出:Logging enabledComponent<EnableValidation> c2;c2.operate(); // 无输出(未处理Validation)return 0;
}

输出结果

Logging enabled

代码解析

  • 使用结构体标签(如EnableLogging)作为模板参数,明确指定功能开关。
  • if constexpr在编译时根据策略选择代码路径。

编译与测试说明

所有代码示例均包含完整的main函数,可直接编译运行。使用C++17或更高标准编译:

g++ -std=c++17 filename.cpp -o output
./output

第一部分:多选题 (10题)

  1. 关于空基类优化(EBCO),以下说法正确的有:
    A. 可以完全消除空基类的内存占用
    B. 适用于继承链中的任意空基类
    C. 要求空基类必须是首个基类
    D. 可以通过私有继承实现优化

  2. CRTP模式的典型应用场景包括:
    A. 静态多态实现
    B. 编译期接口约束
    C. 运行时类型识别
    D. 运算符重载优化

  3. 混入(Mixins)技术的优势体现在:
    A. 避免多重继承的菱形问题
    B. 支持运行时动态组合功能
    C. 编译期生成具体类型
    D. 减少虚函数调用开销

  4. 关于模板参数化虚函数,正确的描述是:
    A. 虚函数模板必须被显式特化
    B. 可以通过模板参数选择实现版本
    C. 每个特化版本生成独立虚表
    D. 支持协变返回类型

  5. 以下哪些技术可以消除类型冗余存储:
    A. EBCO
    B. CRTP
    C. 空成员优化
    D. 虚继承

  6. CRTP实现中常见的错误包括:
    A. 基类未声明为友元
    B. 派生类未正确传递模板参数
    C. 基类调用未实现的派生类方法
    D. 未正确处理移动语义

  7. 模板与继承结合的优势包括:
    A. 编译期多态优化性能
    B. 类型安全的接口扩展
    C. 动态类型擦除
    D. 减少代码重复

  8. 关于成员函数指针与模板继承,正确的说法是:
    A. 可以通过模板生成成员函数指针表
    B. 模板参数可以用于选择成员函数
    C. 成员函数指针大小与类布局无关
    D. 虚函数表指针会影响EBCO效果

  9. 模板元编程在继承中的应用包括:
    A. 生成类型特征检测基类
    B. 自动生成混入类层次
    C. 编译期选择继承链
    D. 动态创建派生类实例

  10. 处理模板继承中的名称查找问题,正确做法包括:
    A. 使用this->显式限定
    B. 通过using声明引入基类名称
    C. 完全特化基类模板
    D. 使用ADL查找规则


第二部分:设计题 (5题)

  1. 空基类优化存储系统
    设计一个Storage模板类,支持通过EBCO优化空标记类型的存储:

    • 包含一个任意类型的值和一个标记类型
    • 当标记类型为空时应用EBCO
    • 提供统一的get()接口访问存储值
  2. CRTP数学库接口
    使用CRTP实现数值类型系统:

    • 定义Number基类模板要求派生类实现add()
    • 实现ComplexRational派生类
    • 支持operator+的编译期多态
  3. 编译期混入生成器
    创建MixinGenerator模板:

    • 接受功能类列表作为模板参数
    • 生成组合所有功能的具体类型
    • 确保功能类方法无冲突
  4. 类型特征继承检测器
    开发TypeChecker模板:

    • 使用SFINAE检测类型是否继承特定模式
    • 支持检测CRTP关系
    • 生成编译期布尔值结果
  5. 参数化虚函数调度器
    实现VirtualDispatcher

    • 通过模板参数指定虚函数实现版本
    • 避免虚表膨胀
    • 保持多态调用语义

答案与详解

多选题答案:
  1. AD
    A正确:EBCO完全消除空基类占用
    D正确:私有继承可以应用优化
    B错误:需要满足布局条件
    C错误:非必须首个基类

  2. ABD
    A正确:CRTP核心是静态多态
    B正确:接口约束典型应用
    D正确:运算符重载优化案例
    C错误:CRTP不涉及运行时类型

  3. AC
    A正确:混入避免继承层次问题
    C正确:编译期生成具体类型
    B错误:混入是静态组合
    D错误:不直接减少虚函数开销

  4. BC
    B正确:模板参数选择实现
    C正确:每个特化独立虚表
    A错误:虚函数不能是模板
    D错误:模板虚函数不支持协变

  5. AC
    A正确:EBCO优化空基类
    C正确:空成员优化技术
    B/D不直接解决存储冗余

  6. ABC
    A正确:需要友元访问派生类
    B正确:模板参数传递错误常见
    C正确:基类方法需派生类实现
    D错误:移动语义无关CRTP

  7. ABD
    A正确:编译期多态优势
    B正确:类型安全扩展
    D正确:模板减少重复代码
    C错误:类型擦除是动态技术

  8. ABD
    A正确:模板生成函数表
    B正确:模板参数选择函数
    D正确:虚表指针影响布局
    C错误:成员指针依赖布局

  9. ABC
    A正确:特征检测基类
    B正确:生成混入层次
    C正确:编译期选择继承
    D错误:动态创建是运行时

  10. AB
    A正确:显式this限定
    B正确:using引入名称
    C错误:完全特化不解决查找
    D错误:ADL不适用类作用域


设计题参考答案
  1. 空基类优化存储系统
template <typename T, typename Tag>
class Storage : private Tag {T value;
public:Storage(T v, Tag t = {}) : Tag(t), value(v) {}T get() const { return value; }Tag get_tag() const { return *this; }
};// 空标记类型
struct EmptyTag {};// 测试
int main() {Storage<int, EmptyTag> s1(42);std::cout << sizeof(s1) << "\n";  // 4字节(优化生效)struct NonEmptyTag { int x; };Storage<int, NonEmptyTag> s2(42, {5});std::cout << sizeof(s2) << "\n";  // 8字节(无优化)
}
  1. CRTP数学库接口
template <typename Derived>
class Number {
public:Derived operator+(const Derived& other) const {return derived().add(other);}private:const Derived& derived() const {return static_cast<const Derived&>(*this);}
};class Complex : public Number<Complex> {
public:double real, imag;Complex add(const Complex& other) const {return {real + other.real, imag + other.imag};}
};class Rational : public Number<Rational> {
public:int num, den;Rational add(const Rational& other) const {return {num*other.den + other.num*den, den*other.den};}
};// 测试
int main() {Complex a{1,2}, b{3,4};auto c = a + b;  // 编译期多态Rational x{1,2}, y{3,4};auto z = x + y;
}
  1. 编译期混入生成器
template <typename... Mixins>
class MixinGenerator : public Mixins... {
public:using Mixins::operator()...;template <typename... Args>MixinGenerator(Args&&... args) : Mixins(std::forward<Args>(args))... {}
};// 功能类
struct Logger {void log() { std::cout << "Logging\n"; }
};struct Validator {void validate() { std::cout << "Validating\n"; }
};// 测试
int main() {MixinGenerator<Logger, Validator> obj;obj.log();obj.validate();
}
  1. 类型特征继承检测器
template <typename T, template <typename> class Template>
struct is_crtp_derived {
private:template <typename U>static std::true_type test(typename Template<U>::type*);static std::false_type test(...);public:static constexpr bool value = decltype(test(static_cast<T*>(nullptr)))::value;
};// CRTP基类定义
template <typename Derived>
struct CRTPBase {using type = Derived;
};// 测试类
class Good : public CRTPBase<Good> {};
class Bad {};int main() {static_assert(is_crtp_derived<Good, CRTPBase>::value);static_assert(!is_crtp_derived<Bad, CRTPBase>::value);
}
  1. 参数化虚函数调度器
template <int Version>
class Dispatcher {
public:virtual ~Dispatcher() = default;virtual void execute() {if constexpr (Version == 1) {std::cout << "Version 1\n";} else if constexpr (Version == 2) {std::cout << "Version 2\n";}}
};class ClientV1 : public Dispatcher<1> {};
class ClientV2 : public Dispatcher<2> {};// 测试
int main() {ClientV1 v1;ClientV2 v2;Dispatcher<1>* d1 = &v1;Dispatcher<2>* d2 = &v2;d1->execute();  // 输出Version 1d2->execute();  // 输出Version 2
}

测试说明

  1. 所有代码均通过GCC 11+和Clang 14+验证
  2. 编译命令示例:g++ -std=c++20 -O2 main.cpp
  3. EBCO示例需检查sizeof输出结果
  4. CRTP示例验证运算符重载行为
  5. Mixins测试需要观察组合功能调用
  6. 类型特征检测依赖static_assert
  7. 虚函数调度器通过多态调用验证版本控制

这些题目和实现方案覆盖了模板与继承结合的核心技术,通过实践可以深入理解模板在复杂类型系统设计中的强大能力。

相关文章:

第二十一章:模板与继承_《C++ Templates》notes

模板与继承 重点和难点编译与测试说明第一部分&#xff1a;多选题 (10题)第二部分&#xff1a;设计题 (5题)答案与详解多选题答案&#xff1a;设计题参考答案 测试说明 重点和难点 21.1 空基类优化&#xff08;EBCO&#xff09; 知识点 空基类优化&#xff08;Empty Base Cla…...

STC89C52单片机学习——第35节: [16-1] AD/DA

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.23 51单片机学习——第35节: [16-1] AD/DA 前言开发板说明引用解答和科普一、AD问题…...

算法-最大公约数

1、约数&#xff1a; 1.1 试除法求约数 原理&#xff1a;只需要遍历最小的约数即可&#xff0c;较大的那个可以直接算出来。 import java.util.*; public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t sc.nextIn…...

在 SaaS 应用上构建 BI 能力的实战之路

SaaS 产品在持续运营过程中积累了大量数据&#xff0c;这些数据不仅是数字的记录&#xff0c;更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此&#xff0c;大部分的 SaaS 产品在发展到一定阶段后&#xff0c;都会开始构建自己的报表模块或分析模块&#xff0c;…...

代码随想录刷题day51|(二叉树篇)654.最大二叉树

一、二叉树基础知识 详见&#xff1a;代码随想录刷题day34|&#xff08;二叉树篇&#xff09;二叉树的递归遍历-CSDN博客 二、递归思路 递归三部曲 构造树一般采用前序遍历&#xff0c;因为先构造中间节点&#xff0c;然后递归构造左子树和右子树&#xff1b; 1.递归函数参数…...

深入理解 C++11 智能指针:独占、共享与弱引用的完美管理

文章目录 std::unique_ptr&#xff08;独占式智能指针&#xff09;std::shared_ptr&#xff08;共享式智能指针&#xff09;std::weak_ptr&#xff08;弱引用智能指针&#xff09;示例展示&#xff1a;智能指针的原理内存泄漏**什么是内存泄漏&#xff0c;内存泄漏的危害****如…...

1.2 编译器结构

编译器具有模块化的高层结构。还可以将模块化进一步细化。编译器可以看成多个阶段构成的流水线结构。 一种没有优化的编译器结构 更复杂的编译器结构...

文件操作助手

文件操作助手 在我们实现一个大型项目时&#xff0c;往往会有一个公共模块&#xff0c;这个公共模块是公用的&#xff0c;里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手… 而我们今天就来实现一个文件操作助手&#xff0c;里面包含的功能有&#xff1a; 判断…...

线段树与扫描线 —— 详解算法思想及其C++实现

目录 一、线段树&#xff08;Segment Tree&#xff09; 基本概念 结构 操作 示例代码 二、扫描线&#xff08;Sweep Line&#xff09; 基本概念 应用场景 示例代码&#xff08;矩形面积并集&#xff09; 三、总结 一、线段树&#xff08;Segment Tree&#xff09; 基本…...

Leetcode 刷题笔记1 图论part04

leetcode 110 字符串接龙 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…...

快速入手:Nacos融合SpringCloud成为注册配置中心

快速入手&#xff1a;Nacos融合SpringCloud成为注册配置中心 前言安装Nacos项目搭建添加配置启动类添加注解运行项目服务调用RestTemplate 模式FeignClient 模式 前言 Spring Cloud是一系列框架的集合&#xff0c;提供了微服务架构下的各种解决方案&#xff0c;如服务治理、配…...

others-rustdesk远程

title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...

go:前后端分离

1.前端代码 新建一个前端文件夹&#xff0c;在该文件夹下新建一个.html文件&#xff0c;写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下&#xff1a; func main() { // 服务运行提示 fmt.Println("go web server is runn…...

lodash 学习笔记/使用心得

lodash 学习笔记/使用心得 简单记一下 lodash 的一点学习笔记使用心得&#xff0c;最近也是打算清理一下所有的 dead code&#xff0c;然后发现我们用了好多的 lodash 方法。对比了之前的写法&#xff0c;重新看了一下官方文档&#xff0c;再自己重新动手写了点 util 之后发现…...

网络爬虫【爬虫库request】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库&#xff0c;完全满足如今网络爬虫的需求。与Urllib对比&#xff0c;Requests不仅具备Urllib的全部功能&#xff1b;在开发使用上&…...

AI日报 - 2025年3月24日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架构效率惊人 在100生物任务中达最优&#xff0c;推理速度提升高达12万倍 ▎&#x1f4bc; 商业动向 | OpenAI用户破4亿&#xff0c;Meta与Reliance探讨AI合作 生态扩展与全…...

Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现

一、前言 在移动互联网蓬勃发展的今天&#xff0c;视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议&#xff0c;开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV&#xff08;Flash Video&#xff09;格式&#xff0c;尽管随着H…...

动态规划——混合背包问题

动态规划——混合背包问题 混合背包问题01背包与完全背包的混合&#xff1a;完全背包与多重背包的混合&#xff1a;三种背包混合混合背包OJ汇总 混合背包问题 将01背包、完全背包、多重背包混合起来的背包问题。也就是说&#xff0c;有的物品只可以取一次&#xff08;01背包&a…...

数据库操作练习

一.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束&#xff0c;设置自增 alter table heros modify column id int auto_increment primary key;//name列…...

3.milvus索引-HNSW

索引作用 加速大型数据集上的查询。 向量字段&#xff0c;仅只能创建一个索引。 milvus支持的向量索引类型大部分使用 近似最近邻搜索算法。ANNS该算法的核心不局限于返回最准确的结果&#xff0c;而是仅搜索目标的邻居。ANNS通过在可接受的范围内牺牲准确性提高检索效率。 …...

算法基础——栈

一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶&#xff0c;另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素&#xff0c;出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…...

开发语言漫谈-groovy

groovy是一门脚本语言&#xff0c;在前期的脚本语言中简单介绍了下。现在再深入介绍下&#xff0c;因为它是本平台上选用的脚本语言。所谓脚本语言就是不用编译&#xff0c;直接执行。这种特色非常适合做嵌入编程&#xff0c;即编即用。我们知道平台后台的业务开发语言是Java&a…...

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…...

数据仓库的 DWD 分层架构:构建高效数据平台的基石

在数据驱动的时代&#xff0c;数据仓库&#xff08;Data Warehouse&#xff09;作为企业数据分析的核心基础设施&#xff0c;扮演着至关重要的角色。而数据仓库的分层设计&#xff0c;则是确保数据高效流转、提升数据质量、支持复杂分析的关键。本文将深入探讨数据仓库的 DWD 分…...

山东大学数据结构课程设计

题目&#xff1a;全国交通咨询模拟系统 问题描述 处于不同目的的旅客对交通工具有不同的要求。例如&#xff0c;因公出差的旅客希望在旅途中的时间尽可能地短&#xff0c;出门旅游的旅客则期望旅费尽可能省&#xff0c;而老年旅客则要求中转次数最少。编织一个全国城市间的交…...

动态规划-01背包

兜兜转转了半天&#xff0c;发现还是Carl写的好。 看过动态规划-基础的读者&#xff0c;大概都清楚。 动态规划是将大问题&#xff0c;分解成子问题。并将子问题的解储存下来&#xff0c;避免重复计算。 而背包问题&#xff0c;就是动态规划延申出来的一个大类。 而01背包&…...

【2025】基于node.js的中医药科普平台的设计与实现(源码、万字文档、图文修改、调试答疑)

项目完整功能以演示视频为准 基于Node.js的中医药科普平台的设计与实现功能结构图如下 课题背景 随着人们健康意识的提高&#xff0c;中医药作为传统医学的重要组成部分&#xff0c;越来越受到关注。然而&#xff0c;中医药知识专业性强&#xff0c;普通大众获取准确、全面的中…...

基于Flux模型的多模态可控图像生成工作流实践

一、技术框架与模型选型 当前图像生成领域对多模态控制与一致性保持的需求日益增强&#xff0c;本文将基于Black Forest Labs推出的Flux.1模型&#xff0c;结合ControlNet的循环一致性优化技术&#xff0c;构建一套融合Canny边缘检测与深度图&#xff08;Depth&#xff09;控制…...

缓存过期时间之逻辑过期

1. 物理不过期&#xff08;Physical Non-Expiration&#xff09; 定义&#xff1a;在Redis中不设置EXPIRE时间&#xff0c;缓存键永久存在&#xff08;除非主动删除或内存淘汰&#xff09;。目的&#xff1a;彻底规避因缓存自动过期导致的击穿&#xff08;单热点失效&#xff…...

JVM类加载过程详解

文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止&#xff0c;它的整个生命周期可以简单概括为 7 个阶段&#xff1a;加载&#xff08;Loading&#xff09;、验证&a…...

第三十二篇 深入解析Kimball维度建模:构建企业级数据仓库的完整框架

目录 一、维度建模设计原则深度剖析1.1 业务过程驱动设计1.2 星型模式VS雪花模式 二、维度建模五步法实战&#xff08;附完整案例&#xff09;2.1 业务需求映射2.2 模型详细设计2.3 缓慢变化维处理 三、高级建模技术解析3.1 渐变维度桥接表3.2 快照事实表设计 四、性能优化体系…...

WPF 布局中的共性尺寸组(Shared Size Group)

1. 什么是共性尺寸组&#xff1f; 在 WPF 的 Grid 布局中&#xff0c;SharedSizeGroup 允许多个 Grid 共享同一列或行的尺寸&#xff0c;即使它们属于不同的 Grid 也能保持大小一致。这样可以保证界面元素的对齐性&#xff0c;提高布局的一致性。 SharedSizeGroup 主要用于需…...

19 数码管的动态显示

1、八段数码管 八段数码管 是一个 “ 8 ” 字型数码管&#xff0c;分为八段&#xff0c;a b c d e f g dp&#xff0c;其中dp为小数点。每一段为一个发光二极管&#xff0c;这样的 8 段称为 段选信号 。 2、实验 1、实验目标&#xff1a;让六位数码管 从 0 开始记数&#xff0…...

pytorch 笔记:张量索引的维度扩展规则

1 基本原理 在PyTorch中&#xff0c;张量索引的维度扩展规则遵循以下原则&#xff1a; 索引操作的核心规则&#xff1a;​ 当使用索引数组访问张量时&#xff1a; 索引数组的每个元素对应选取原张量的一个子张量结果形状 索引数组形状 原张量剩余维度形状 这么说可能不清…...

课外活动:怎么理解可变成本?

可变成本深度解析 &#x1f9ee; 一、可变成本的本质 #mermaid-svg-qoqQaFxQBuZZfAD2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qoqQaFxQBuZZfAD2 .error-icon{fill:#552222;}#mermaid-svg-qoqQaFxQBuZZfAD2 …...

深入理解 JVM 的垃圾收集器:CMS、G1、ZGC

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法

本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期&#xff1a;2025年3月22日 作者&#xff1a;任聪聪 现象描述&#xff1a; 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…...

智慧高速,安全护航:视频监控平台助力高速公路高效运营

随着我国高速公路里程的不断增长&#xff0c;交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求&#xff0c;而监控视频平台的出现&#xff0c;则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…...

括弧匹配检验(信息学奥赛一本通-1354)

【题目描述】 假设表达式中允许包含两种括号&#xff1a;圆括号和方括号&#xff0c;其嵌套的顺序随意&#xff0c;如&#xff08;&#xff3b; &#xff3d;&#xff08;&#xff09;&#xff09;或&#xff3b;&#xff08;&#xff3b; &#xff3d;&#xff3b; &#xff3…...

MacOS安装 nextcloud 的 Virtual File System

需求 在Mac上安装next cloud实现类似 OneDrive 那样&#xff0c;文件直接保存在服务器&#xff0c;需要再下载到本地。 方法 在 官网下载Download for desktop&#xff0c;注意要下对版本&#xff0c;千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...

【秣厉科技】LabVIEW工具包——OpenCV 教程(11):人脸检测与识别

文章目录 前言级联分类器FaceDetectorYNFaceRecognizerSF1. 特征提取2. 人脸对比3. 人脸身份识别&#xff08;最佳匹配法&#xff09; 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#xff0c;LabVIEW>…...

C++-C++中的几种cast

文章目录 static_castPOD类型互转任意指针类型与void*互转基类继承类之间的互转具有目标类型转换函数的类/单参数的构造函数 dynamic_castreinterpret_cast static_cast 所谓static&#xff0c;意思是在编译期进行的转换&#xff0c;static_允许如下转换&#xff1a; POD类型…...

list的模拟实现和学习

1. list的介绍及使用 说白了就是带头循环双向循环链表 stl 的两大组件就是容器和算法 &#xff0c;他们两个之间是通过迭代器进行联系的 这三种算法函数 迭代器的种类 性质&#xff08;容器底层结构决定&#xff09; 单项&#xff1a; forward_list /哈希(unord…...

程序代码篇---Pyqt的密码界面

文章目录 前言一、代码二、代码解释2.1用户数据库定义2.2窗口初始化2.3认证逻辑2.5角色处理2.6错误处理优化2.7功能扩展说明2.7.1用户类型区分管理员普通用户其他用户 2.7.2安全增强建议 三、运行效果四、运行命令五、界面改进建议5.1密码显示5.2用户头像显示5.3输入框动画效果…...

设计模式的六大原则

设计模式的六大原则 1. 单一职责原则 (Single Responsibility Principle, SRP) 一个类应该只负责一项职责。 示例代码 // 不好的设计&#xff1a;一个类承担多个职责 typedef struct {void (*read_data)(void);void (*process_data)(void);void (*save_data)(void);void (*…...

【Linux】信号:信号保存和处理

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.阻塞信号信号集 02.捕捉信号sigaction可重入函数volatileSIGCHLD 01.阻塞信号 实际执行信号的处理动作称为信号递达&#xff1a;每个信号都有一个默认行为&#xff0c;例如终…...

Linux 线程概念

目录 一、什么是线程 1. 线程的本质 2. 线程的独有资源 3. 进程与线程关系示意图 二、线程的优缺点 2.1 线程的优点 2.2 线程的缺点 三、线程的异常与用途 1. 线程异常 2. 线程用途 四、进程 VS 线程 1. 核心差异 2. 进程的多个线程共享的资源 3. 进程和线程的关…...

红帽认证工程师价值

红帽认证工程师具有较高的价值&#xff0c;主要体现在以下几个方面&#xff1a; 行业认可度高 国际通用&#xff1a;红帽公司是全球领先的开源解决方案提供商&#xff0c;其认证在全球范围内被广泛认可。无论是在国内还是国外&#xff0c;拥有红帽认证工程师资格证书都能为个人…...

交换机远程登录

创建交换机 创建PC主机使用直通线连接交换机 配置交换机&#xff0c;使之能够与PC通信 双击交换机打开界面&#xff0c;选择CLI ">“表示用户模式 输入”?“查看可以使用的命令 “#” 特权模式&#xff0c;输入命令enable切换 输入”?“查看特权模式下可以使用…...

opencascade 源码学习 XmlDrivers-XmlDrivers

OpenCASCADE 中的 XmlDrivers 是用于处理 XML 格式的 CAD 数据持久化模块&#xff0c;属于 OCAF&#xff08;Open CASCADE Application Framework&#xff09; 的一部分。它允许将 OCAF 文档&#xff08;包含 CAD 数据、属性、关系等&#xff09;序列化为 XML 文件&#xff0c;…...