【C++模板与泛型编程】实例化
目录
一、模板实例化的基本概念
1.1 什么是模板实例化?
1.2 实例化的触发条件
1.3 实例化的类型
二、隐式实例化
2.1 隐式实例化的工作原理
2.2 类模板的隐式实例化
2.3 隐式实例化的局限性
三、显式实例化
3.1 显式实例化声明(extern template)
3.2 显式实例化定义(template)
3.3 显式实例化的应用场景
四、实例化与模板参数
4.1 类型参数实例化
4.2 非类型参数实例化
4.3 模板模板参数实例化
五、实例化与特化
5.1 模板特化对实例化的影响
5.2 部分特化与实例化
六、实例化与编译模型
6.1 包含编译模型(Inclusion Model)
6.2 显式实例化编译模型
6.3 分离编译模型(C++20 模块)
七、实例化与性能考虑
7.1 代码膨胀问题
7.2 编译时间优化
7.3 运行时性能
八、实战案例:自定义容器的实例化
九、总结
在 C++ 模板编程中,"实例化"(Instantiation)是连接模板定义与具体类型 / 值的桥梁。当我们编写一个模板函数或类时,编译器并不会立即生成代码,而是在我们使用模板时,根据实参类型动态生成对应的具体实例。理解模板实例化的机制对于高效使用 C++ 模板至关重要,本文将深入探讨模板实例化的各个方面。
一、模板实例化的基本概念
1.1 什么是模板实例化?
模板实例化是指编译器根据模板定义和实际参数(类型或值)生成具体代码的过程。例如,当我们使用std::vector<int>
时,编译器会根据vector
模板生成针对int
类型的具体实现。
1.2 实例化的触发条件
模板不会自动实例化,而是在以下情况发生时被触发:
- 显式实例化声明:使用
extern template
语法告诉编译器某个模板实例将在其他地方定义 - 显式实例化定义:使用
template
语法强制编译器生成特定实例 - 隐式实例化:当代码中使用模板且需要具体类型时,编译器自动生成实例
1.3 实例化的类型
模板实例化分为两种类型:
- 函数模板实例化:生成具体的函数
- 类模板实例化:生成具体的类及其成员函数
下面通过简单示例说明:
// 函数模板
template<typename T>
T add(T a, T b) {return a + b;
}// 类模板
template<typename T>
class Container {
private:T value;
public:Container(T val) : value(val) {}T getValue() const { return value; }
};int main() {// 隐式实例化函数模板int sum = add(1, 2); // 实例化 add<int>(int, int)// 隐式实例化类模板Container<double> c(3.14); // 实例化 Container<double>double val = c.getValue(); // 实例化 Container<double>::getValue()return 0;
}
二、隐式实例化
2.1 隐式实例化的工作原理
当代码中使用模板且需要具体类型时,编译器会自动实例化模板。例如:
template<typename T>
T max(T a, T b) {return a > b ? a : b;
}int main() {int result = max(10, 20); // 隐式实例化 max<int>(int, int)double d = max(1.5, 2.5); // 隐式实例化 max<double>(double, double)return 0;
}
2.2 类模板的隐式实例化
类模板的隐式实例化只会实例化被使用的成员函数。例如:
template<typename T>
class Logger {
public:void log(const T& value) {// 日志实现}void debug(const T& value) {// 调试信息实现}
};int main() {Logger<int> logger; // 实例化 Logger<int>logger.log(42); // 实例化 Logger<int>::log(int)// logger.debug(42); // 如果未调用,则不会实例化 debug 函数return 0;
}
2.3 隐式实例化的局限性
- 需要完整类型:模板实例化时,类型必须是完整的(即类型定义可见)
- 依赖上下文:实例化过程依赖于使用模板的上下文,可能导致代码膨胀
三、显式实例化
3.1 显式实例化声明(extern template)
显式实例化声明告诉编译器某个模板实例将在其他地方定义,从而避免重复实例化:
// header.h
template<typename T>
class Vector {// 类定义
};// 在某个源文件中显式实例化
extern template class Vector<int>; // 声明 Vector<int> 将在其他地方实例化
3.2 显式实例化定义(template)
显式实例化定义强制编译器生成特定实例:
// source.cpp
#include "header.h"// 显式实例化定义
template class Vector<int>; // 强制实例化 Vector<int>// 也可以显式实例化函数模板
template int add<int>(int, int);
3.3 显式实例化的应用场景
- 减少编译时间:在大型项目中,可以控制模板实例化的位置,避免重复编译
- 实现分离编译:将模板定义和实例化分离,提高编译效率
四、实例化与模板参数
4.1 类型参数实例化
模板类型参数可以通过以下方式实例化:
- 隐式推断:通过函数实参自动推断
- 显式指定:使用
<>
语法显式指定类型
template<typename T>
T identity(T value) {return value;
}int main() {int a = identity(42); // 隐式推断 T 为 intdouble b = identity<double>(3.14); // 显式指定 T 为 doublereturn 0;
}
4.2 非类型参数实例化
非类型参数必须是编译时常量表达式,常见类型包括整数、指针、引用等:
template<int N>
struct Array {int data[N];
};int main() {Array<10> arr; // 正确:N 是编译时常量// int n = 10;// Array<n> arr2; // 错误:n 不是编译时常量return 0;
}
4.3 模板模板参数实例化
模板模板参数允许将模板作为参数传递:
template<template<typename> class Container, typename T>
class Wrapper {
private:Container<T> container;
public:// 构造函数和方法
};int main() {Wrapper<std::vector, int> wrapper; // 实例化 Wrapperreturn 0;
}
五、实例化与特化
5.1 模板特化对实例化的影响
当存在模板特化时,实例化会优先选择最匹配的特化版本:
// 通用模板
template<typename T>
struct IsPointer {static constexpr bool value = false;
};// 指针特化
template<typename T>
struct IsPointer<T*> {static constexpr bool value = true;
};int main() {bool b1 = IsPointer<int>::value; // 使用通用模板,值为 falsebool b2 = IsPointer<int*>::value; // 使用特化版本,值为 truereturn 0;
}
5.2 部分特化与实例化
类模板的部分特化会根据参数匹配规则选择最合适的特化版本:
// 通用模板
template<typename T1, typename T2>
class Pair {};// 部分特化:第二个参数为 int
template<typename T1>
class Pair<T1, int> {};int main() {Pair<double, int> p1; // 使用部分特化版本Pair<double, char> p2; // 使用通用模板return 0;
}
六、实例化与编译模型
6.1 包含编译模型(Inclusion Model)
这是最常见的编译模型,模板定义必须在使用前可见,通常将模板定义放在头文件中:
// math.h
template<typename T>
T square(T value) {return value * value;
}// main.cpp
#include "math.h"int main() {int result = square(5); // 使用模板,定义必须可见return 0;
}
6.2 显式实例化编译模型
通过显式实例化,可以将模板定义和使用分离:
// math.h
template<typename T>
T square(T value); // 声明// math.cpp
#include "math.h"template<typename T>
T square(T value) { // 定义return value * value;
}// 显式实例化
template int square<int>(int);
template double square<double>(double);// main.cpp
#include "math.h"int main() {int result = square(5); // 使用已实例化的版本return 0;
}
6.3 分离编译模型(C++20 模块)
C++20 引入的模块机制提供了更高效的模板编译方式:
// math.module.cpp
export module math;export template<typename T>
T square(T value) {return value * value;
}// main.cpp
import math;int main() {int result = square(5); // 使用模块中的模板return 0;
}
七、实例化与性能考虑
7.1 代码膨胀问题
过度的模板实例化可能导致代码体积增大,称为 "代码膨胀"。可以通过以下方式缓解:
- 使用显式实例化控制实例化位置
- 避免不必要的模板参数
- 使用模板元编程减少运行时开销
7.2 编译时间优化
模板实例化会增加编译时间,特别是在大型项目中。可以通过以下方法优化:
- 使用预编译头文件
- 减少模板的复杂性
- 采用显式实例化和模块机制
7.3 运行时性能
模板实例化生成的代码通常与手写的特定类型代码具有相同的性能,甚至更好,因为编译器可以进行更多优化。
八、实战案例:自定义容器的实例化
下面通过一个自定义动态数组容器的例子,演示模板实例化的实际应用:
#include <iostream>
#include <memory>// 手动实现 make_unique (C++11 适用,修复版)
#if __cplusplus < 201402L
namespace std {// 泛型版本template<typename T, typename... Args>std::unique_ptr<T> make_unique(Args&&... args) {return std::unique_ptr<T>(new T(std::forward<Args>(args)...));}// 动态数组版本 (修正)template<typename T>typename std::enable_if<std::is_array<T>::value && std::extent<T>::value == 0,std::unique_ptr<T>>::typemake_unique(size_t n) {using ElementType = typename std::remove_extent<T>::type;return std::unique_ptr<T>(new ElementType[n]());}// 禁用多维数组template<typename T, typename... Args>typename std::enable_if<std::extent<T>::value != 0, std::unique_ptr<T>>::typemake_unique(Args&&...) = delete;
}
#endif// 动态数组容器模板 (保持不变)
template<typename T>
class DynamicArray {
private:std::unique_ptr<T[]> data;size_t size;size_t capacity;public:// 构造函数explicit DynamicArray(size_t initialCapacity = 10): size(0), capacity(initialCapacity) {data = std::make_unique<T[]>(capacity);}// 添加元素void add(const T& value) {if (size >= capacity) {resize(capacity * 2);}data[size++] = value;}// 访问元素T& operator[](size_t index) {return data[index];}const T& operator[](size_t index) const {return data[index];}// 获取大小size_t getSize() const {return size;}private:// 调整容量void resize(size_t newCapacity) {std::unique_ptr<T[]> newData = std::make_unique<T[]>(newCapacity);for (size_t i = 0; i < size; ++i) {newData[i] = data[i];}data = std::move(newData);capacity = newCapacity;}
};// 测试函数 (保持不变)
void testDynamicArray() {// 实例化 DynamicArray<int>DynamicArray<int> intArray;intArray.add(10);intArray.add(20);std::cout << "Int Array: ";for (size_t i = 0; i < intArray.getSize(); ++i) {std::cout << intArray[i] << " ";}std::cout << std::endl;// 实例化 DynamicArray<std::string>DynamicArray<std::string> stringArray;stringArray.add("Hello");stringArray.add("World");std::cout << "String Array: ";for (size_t i = 0; i < stringArray.getSize(); ++i) {std::cout << stringArray[i] << " ";}std::cout << std::endl;
}int main() {testDynamicArray();return 0;
}
当我们创建DynamicArray<int>
和DynamicArray<std::string>
时,编译器会为这两种类型分别实例化整个类及其成员函数。注意,成员函数只有在被调用时才会被实例化。
九、总结
模板实例化是 C++ 泛型编程的核心机制,它将抽象的模板定义转换为具体的代码实现。理解隐式实例化、显式实例化、特化以及它们与模板参数的交互,对于编写高效、可维护的模板代码至关重要。在实际开发中,合理控制模板实例化可以避免代码膨胀,提高编译和运行效率。随着 C++ 标准的发展,如模块机制的引入,模板实例化的方式也在不断演进,开发者需要根据项目需求选择最合适的实践方式。
相关文章:
【C++模板与泛型编程】实例化
目录 一、模板实例化的基本概念 1.1 什么是模板实例化? 1.2 实例化的触发条件 1.3 实例化的类型 二、隐式实例化 2.1 隐式实例化的工作原理 2.2 类模板的隐式实例化 2.3 隐式实例化的局限性 三、显式实例化 3.1 显式实例化声明(extern templat…...
CI/CD 实践:实现可灰度、可监控、可回滚的现代部署体系
CI/CD 实践:实现可灰度、可监控、可回滚的现代部署体系 一、背景 随着微服务架构、云原生技术的普及,传统的手动部署方式已难以满足现代业务快速迭代、高可用的需求。CI/CD(持续集成/持续交付)作为现代 DevOps 的核心环节&#…...
后退的风景
后退的风景 前言回退的景色 前言 坐在高铁的窗边,这是一趟回程的旅途,所有的树木、铁塔、石碑向后涌去,一如从前。 所谓风景正是如此,无非是看到了一段触动内心的感受,这段感受可能是伤心,亦或是欣喜。这…...
腾讯云安装halo博客
腾讯云安装halo博客 如果网站已经配置好可以直接使用的,可以直接跳转到《6》进行1panel的安装, 如果跳过之后安装出现问题,可以看看前面步骤 从《6》开始的安装视频 我估计是网站默认放开的端口和他返代理应用的端口冲突了,重装…...
Excel宏和VBA的详细分步指南
Excel宏和VBA的详细分步指南 一、宏录制与代码分析(超详细版)1. 启用开发工具2. 录制宏 二、VBA核心语法(深入详解)1. 变量与数据类型2. 循环结构3. 条件判断2. Worksheet对象3. Range对象的高级操作 四、实用案例扩展1. 数据清洗…...
第十六届蓝桥杯复盘
文章目录 1.数位倍数2.IPv63.变换数组4.最大数字5.小说6.01串7.甘蔗8.原料采购 省赛过去一段时间了,现在复盘下,省赛报完名后一直没准备所以没打算参赛,直到比赛前两天才决定参加,赛前两天匆匆忙忙下载安装了比赛要用的编译器ecli…...
深度学习---模型预热(Model Warm-Up)
一、基本概念与核心定义 模型预热是指在机器学习模型正式训练或推理前,通过特定技术手段使模型参数、计算图或运行环境提前进入稳定状态的过程。其本质是通过预处理操作降低初始阶段的不稳定性,从而提升后续任务的效率、精度或性能。 核心目标…...
python:pymysql概念、基本操作和注入问题讲解
python:pymysql分享目录 一、概念二、数据准备三、安装pymysql四、pymysql使用(一)使用步骤(二)查询操作(三)增(四)改(五)删 五、关于pymysql注入…...
科普:极简的AI乱战江湖
本文无图。 大模型 2022年2月,文生图应用的鼻祖Midjourney上线。 2022年8月,开源版的Midjourney,也就是Stable Diffusion上线。 2022年11月30日,OpenAI正式发布ChatGPT-3.5。 此后,不断有【大模型】面世&…...
养生指南:解锁健康生活新方式
一、饮食:精准搭配,科学滋养 饮食以 “少加工、多天然” 为核心。早餐选择希腊酸奶搭配蓝莓与一把混合坚果,富含蛋白质与抗氧化成分;午餐用藜麦饭搭配香煎龙利鱼和彩椒炒芦笋,营养全面且低脂;晚餐则是山药…...
Dolphinscheduler执行工作流失败,后台报duplicate key错误
背景 现场童鞋发来一张图如下 我很懵逼,不知道出了啥问题,在聊天工具上聊了10m还不知道啥,干脆就搞个腾讯会议(在此感谢腾讯爸爸免费会议)。哦,现场临时搭建了dolphinscheduler,然后导入工作流…...
【Vue】路由2——编程式路由导航、 两个新的生命周期钩子 以及 路由守卫、路由器的两种工作模式
目录 一、路由的push 与 replace切换 二、编程式路由导航 三、缓存路由组件 四、新增的两个生命周期钩子 五、路由守卫 5.1 前置路由守卫 5.2 后置路由守卫 5.3 独立路由守卫 5.4 组件内 路由守卫 六、路由器的两种工作模式 6.1 hash模式 6.2 history模式 6.3 V…...
VDC、SMC、MCU怎么协同工作的?
华为视频会议系统中,VDC(终端控制)、SMC(会话管理)、MCU(媒体处理) 通过分层协作实现端到端会议管理,其协同工作机制可总结为以下清晰架构: 1. 角色分工 组件核心职责类…...
ETL数据集成产品选型需要关注哪些方面?
ETL(Extract,Transform,Load)工具作为数据仓库和数据分析流程中的关键环节,其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年,通过自身产品的实践应用,对 ETL 产品选型…...
DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表,来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型(VLM)正在成…...
【达梦数据库】过程、函数、包头和包体详解零基础
目录 背景参考链接解释包头包体 背景 最近遇到关于包头和包体的问题,学习并记录 参考链接 参考链接: oracle的过程、函数、包头和包体详解零基础 解释 包头主要用于定义接口,包体主要用以实现包体中声明的存储过程、函数等。 包头 包体...
HarmonyOS开发样式布局
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
SpringCloud——EureKa
目录 1.前言 1.微服务拆分及远程调用 3.EureKa注册中心 远程调用的问题 eureka原理 搭建EureKaServer 服务注册 服务发现 1.前言 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为服务。 优点: 降…...
【力扣刷题】LeetCode763-划分字母区间
文章目录 1. LeetCode763_划分字母区间 1. LeetCode763_划分字母区间 题目链接🔗 🐧解题思路: 区间合并 题目中这句话很关键“我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。” 你这句话你可以理解为 把…...
使用for循环和字典功能,统计字符出现在一个英文句子中的次数(python)
本题目要求写出一段代码实现输入一个英文句子后,统计句子中各个字符(不区分大小写,包含空格和标点符号)出现的次数。 输入格式: 请例如:输入 Life is short,we need Python. 。 输出格式: 对每一个字符输出对应的出现次数&…...
带你搞懂@Valid和@Validated的区别
前言 有参数传递的地方都少不了参数校验。在实际开发过程中,参数校验是保证程序健壮性的重要环节,前端的参数校验是为了用户体验,后端的参数校验是为了安全。试想一下,如果在 Controller 层中没有经过任何校验的参数通过 Service层…...
大数据hadoop小文件处理方案
Hadoop处理小文件问题的解决方案可分为存储优化、处理优化和架构优化三个维度,以下是综合技术方案及实施要点: 一、存储层优化方案 1.文件合并技术 离线合并:使用hadoop fs -getmerge命令将多个小文件合并为大文件并重新上传; MapReduce合并:开发专用MR…...
安装NASM
安装NASM 注意:这篇文章在librdkafka安装系列,不需要参考,仅为了记录而写,请不要参考,后续编译openssl的时候,可以使用参数no-asm,不影响整个的编译步骤。这里主要作为记录帖子。 本篇是Windows系统编译Qt使用的kafka(librdkafka)系列可以不参考的一篇,编译librdkaf…...
RabbitMQ-高级
RabbitMQ-高级 文章目录 RabbitMQ-高级前言:消息可靠性问题1.生产者可靠性1.生产者重连2.生产者确认机制3.生产者代码实现原理 2.MQ的可靠性1.数据持久化2.LazyQueue 3.消费者可靠性1.消费者确认机制1.确认机制2.确认功能 2.失败重试机制1.开启失败重试机制2.多次失…...
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务 引言 在现代微服务架构中,消息队列扮演着至关重要的角色,而Apache Kafka凭借其高吞吐量、低延迟和可扩展性,成为了许多企业的首选。本文将详细介绍如何在Spring Boot应用…...
Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目
环境: Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows环境安装教程: 链接遇到的问题(问题:解决方案) 点击Linux打包按钮,跳转至网页而不是执行打包流程:用VS打开项…...
【图像大模型】FLUX.1-dev:深度解析与实战指南
FLUX.1-dev:深度解析与实战指南 一、引言二、模型架构与技术原理(一)模型架构(二)Rectified Flow 技术(三)指导蒸馏(Guidance Distillation) 三、项目运行方式与执行步骤…...
mariadb 升级 (通过yum)
* 注意下 服务名, 有的服务器上是mysql,有的叫mariadb,mysqld的 #停止 systemctl stop mysql #修改源 vi /etc/yum.repos.d/MariaDB.repo baseurl http://yum.mariadb.org/11.4/centos7-amd64 #卸载 yum remove mysql #安装 yum install MariaDB-server galera-4 MariaDB-…...
Flink 非确定有限自动机NFA
Flink 是一个用于状态化计算的分布式流处理框架,而非确定有限自动机(NFA, Non-deterministic Finite Automaton)是一种在计算机科学中广泛使用的抽象计算模型,常用于正则表达式匹配、模式识别等领域。 Apache Flink 提供了对 NFA…...
Profinet转Ethernet IP主站网关:点燃氢醌生产线的智慧之光!
案例分享:转角指示器和Profinet转EthernetIP网关的应用 在现代工业自动化中,设备和系统之间的高效通信至关重要。最近,我们在某大型化工企业的生产线上实施了一个项目,旨在通过先进的设备和通信技术提高生产效率和安全性。该项目…...
动态IP技术在跨境电商中的创新应用与战略价值解析
在全球化4.0时代,跨境电商正经历从"流量红利"向"技术红利"的深度转型。动态IP技术作为网络基础设施的关键组件,正在重塑跨境贸易的运营逻辑。本文将从技术架构、应用场景、创新实践三个维度,揭示动态IP如何成为跨境电商突…...
WEB安全--SQL注入--Oracle注入
一、Oracle知识点了解 1.1、系统变量与表 版本号:SELECT * FROM V$VERSION 用户名:USER、SYS_CONTEXT(USERENV,SESSION_USER) 库名:ALL_USERS、USER_USERS、DBA_USERS 表名:ALL_TABLES、DBA_TABLES、USER_TABLES 字段名&…...
Unity预制体变体(Prefab Variants)、接口(Interface)、抽象类(Abstract Class)、枚举(Enumeration)
一、预制体变体(Prefab Variants) 预制体变体是什么? 预制体变体是指从同一个基础预制体派生出来的不同版本的预制体。这些变体可以包含不同的组件配置、属性值、子对象或者行为,但它们共享一些共同的基础结构和特性。通过创建预…...
pymol包安装和使用
PyMOL 是一款分子可视化软件,而pymol则是其对应的 Python 包,借助它能够实现对 PyMOL 的编程控制。 主要功能 分子结构可视化:支持展示蛋白质、核酸、小分子等多种分子的 3D 结构。自定义渲染:可对分子的表示方式、颜色以及光照…...
【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(2)
机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 神经网络在图像识别及手写数字识别中的应用一、神经网络在图像识别中的应用࿰…...
【神经网络与深度学习】model.eval() 模式
引言 在深度学习模型的训练和推理过程中,不同的模式设置对模型的行为和性能有着重要影响。model.eval() 是 PyTorch 等深度学习框架中的关键操作,它用于将模型切换到评估模式(evaluation mode),确保模型在测试和推理阶…...
ASIC和FPGA,到底应该选择哪个?
ASIC和FPGA各有优缺点。 ASIC针对特定需求,具有高性能、低功耗和低成本(在大规模量产时);但设计周期长、成本高、风险大。FPGA则适合快速原型验证和中小批量应用,开发周期短,灵活性高,适合初创企…...
JavaScript 性能优化实战指南
JavaScript 性能优化实战指南 前言 随着前端应用复杂度提升,JavaScript 性能瓶颈日益突出。高效的性能优化不仅能提升用户体验,还能增强系统稳定性和可维护性。本文系统梳理了 JavaScript 性能优化的核心思路、常见场景和实战案例,结合代码…...
Unity3D HUD UI性能优化方案
前言 在Unity3D中实现高性能的HUD UI需要综合考虑渲染效率、CPU开销和内存管理。以下是分步的优化方案: 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 1. 降低Draw Call:合批与图集 …...
晶圆Map图芯片选择显示示例
效果 列表中有四个Mark点,需求是选择某一个点时在Map图中区别显示出来。 实现思路: 根据DataGrid 的行选择 SelectionChanged事件,先循环所有Mark点清除Rectangle的边框大小,再获取选择的芯片,设置Rectangle的边框大小和颜色。 示例代码 1.UI代码 <DataGrid Grid.…...
HarmonyOS实战:自定义时间选择器
前言 最近在日常鸿蒙开发过程中,经常会使用一些时间选择器,鸿蒙官方提供的时间选择器满足不了需求,所以自己动手自定义一些经常会使用到的时间选择器,希望能帮到你,建议点赞收藏! 实现效果 需求分析 默认…...
汽车零部件的EMI抗扰性测试
写在前面 本系列文章主要讲解汽车零部件的EMI抗扰性测试的相关知识,希望能帮助更多的同学认识和了解汽车零部件的EMI抗扰性测试。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1. 背景介绍 多年以来,电磁干扰(EMI)效应一直是现代电子控制系统中备受关注的一个问题。…...
新能源汽车充电桩管理平台如何利用智慧技术优化资源配置问题?
在“双碳”目标的推动下,我国新能源汽车市场迅猛发展,但充电基础设施的供需失衡问题日益突出。部分区域充电桩利用率低下,而核心城区、高速服务区等场景却面临“一桩难求”的困境。智慧技术的引入为解决这一难题提供了新思路。通过物联网&…...
【zookeeper】--部署3.6.3
文章目录 下载解压创建data和logs配置文件1)创建目录并且编辑 zoo.cfg2)接下来将 node01 的 ZooKeeper 所有文件拷贝至 node02 和 node03。推荐从 node02 和 node03 拷贝4)最后 vim /etc/profile 配置环境变量,环境搭建结束。配完环境变量后 source /etc…...
[低代码] 明道云调用本地部署 Dify 的进阶方法
在低代码开发平台明道云中,集成外部智能服务(如 Dify)可以极大地提升自动化和智能化能力。之前我们介绍了使用“发送自定义 API”节点直接调用本地部署的 Dify 服务的方法,虽然简单直观,但该方式存在一些限制,比如无法设置 Timeout、逻辑复用性差等问题。 为了构建更稳定…...
ICU库交叉编译
交叉编译步骤 Step 1: 先进行本机编译 ./runConfigureICU Linux/gccmake Step 2: 执行交叉编译 source /opt/fsl-imx-fb/4.14-sumo/environment-setup-cortexa9hf-neon-poky-linux-gnueabimkdir cross_install./configure --disable-samples --disable-tests --prefix/medi…...
永磁同步电机高性能控制算法(22)——基于神经网络的转矩脉动抑制算法为什么低速时的转速波动大?
0. 前言 在之前的知乎上发过一些转矩脉动抑制/谐波电流抑制的算法。例如: https://zhuanlan.zhihu.com/p/24723996895https://zhuanlan.zhihu.com/p/24723996895 这些算法基本上都需要先知道谐波的频率。 重复控制这个算法虽然可以抑制掉某个频率及其所有整数倍的…...
Java大厂面试实战:Spring Boot与微服务场景中的技术点解析
Java大厂面试实战:Spring Boot与微服务场景中的技术点解析 第一轮:基础技术了解 面试官:谢飞机,你好。从简历上看,你熟悉Spring Boot,那我们来聊聊它的核心功能吧。Spring Boot有哪些主要的特性ÿ…...
Pycharm 选择Python Interpreter
你的系统可能有多个 Python 环境,比如: macOS 自带的 /usr/bin/python3 你用 brew install python 安装的 /opt/homebrew/bin/python3 你可能还用了虚拟环境(venv 或 conda) PyCharm 默认配置可能用的是一个虚拟环境ÿ…...
文件夹如何打包成jar包
应用场景 主要是:比如 maven 引入一个依赖(其实就是下载了一个 jar 包),然后需要修改 jar 包里面的某个文件,然后再重新打包成 jar 包,如下图: 使用方法 使用压缩工具打开这个 jar 包…...