(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类型函数 )

14.2.4 泛型类型函数

​ 到目前为止,我们遇到的泛型类型定义的最大问题是,您对泛型类型元素能做的事情非常少。有两种技术可以用来克服这个限制。第一种是利用运行时库的一些特殊函数,这些函数专门支持泛型类型;第二种(也是更强大的一种)是在定义泛型类时对可以使用的类型进行限制。

​ 本节将重点介绍第一种方法,下一节将重点介绍约束。正如我提到的,有一些 RTL 函数可以处理泛型定义的参数类型 (T):

  • Default(T)实际上是与泛型一起引入的新函数,它返回当前类型的空值或“零值”或null值,可以是零、空字符串、nil等;事实上,全局变量与局部变量不同,编译器会将全局变量初始化为 “零”)

  • TypeInfo(T)返回指向当前版本的泛型类型的运行时信息的指针;有关类型信息的更多信息,请参见第16章

  • SizeOf(T)返回类型的字节数(对于引用类型,如字符串或对象,它将是引用的大小,即32位编译器的4个字节,64位编译器的8个字节)

  • IsManagedType(T)指示类型是否在内存中受管理,例如字符串和动态数组

  • HasWeakRef(T)与支持ARC的编译器相关,表示目标类型是否具有弱引用;这需要特定的内存管理支持

  • GetTypeKind(T)是一种从类型信息访问类型种类的快捷方式;它是比TypeInfo返回的类型定义稍高一级的类型定义

注意 所有这些方法都返回编译器评估过的常量,而不是在运行时调用实际函数。这一点的重要性并不在于这些操作非常快,而在于这使编译器和链接器可以优化生成的代码,删除未使用的分支。如果有一个 case 或 if 语句是基于这些函数之一的返回值,编译器立即就能算出,仅对于给定类型,其中一个分支将被执行,从而删除无用的代码。当针对不同类型编译相同的泛型方法时,可能会使用不同的分支,但编译器同样可以预先计算并优化方法的大小。

GenericTypeFunc 示例中有一个泛型类,展示了三个泛型类型的函数的作用:

typeTSampleClass<T> = classprivateFData: T;publicprocedure Zero;function GetDataSize: Integer;function GetDataName: string;end;function TSampleClass<T>.GetDataSize: Integer;beginResult := SizeOf(T);end;function TSampleClass<T>.GetDataName: string;beginResult := GetTypeName(TypeInfo(T));end;procedure TSampleClass<T>.Zero;beginFData := Default(T);end;

​ 在GetDataName方法中,我使用了GetTypeName函数(System.TypInfo单元的函数),而不是直接访问数据结构,因为它可以执行保持类型名称的字符串值编码的正确转换。

​ 给定上述声明,您可以编译以下测试代码,该代码在三个不同的泛型类型实例上重复三次。我省略了重复的代码,并仅显示用于访问数据字段的语句,因为它们会根据实际类型而改变:

varT1: TSampleClass<Integer>;T2: TSampleClass<string>;T3: TSampleClass<Double>;
beginT1 := TSampleClass<Integer>.Create;T1.Zero;Show('TSampleClass<Integer>');Show('Data: ' + IntToStr(T1.FData));Show('Type: ' + T1.GetDataName);Show('Size: ' + IntToStr(T1.GetDataSize));T2 := TSampleClass<string>.Create;Show('Data: ' + T2.FData);T3 := TSampleClass<Double>.Create;Show('Data: ' + FloatToStr(T3.FData));

运行此代码(来自GenericTypeFunc示例)会产生以下输出:

TSampleClass<Integer>
Marco Cantù, Object Pascal Handbook 11
396 - 14: generics
Data: 0
Type: Integer
Size: 4
TSampleClass<string>
Data:
Type: string
Size: 4
TSampleClass<Double>
Data: 0
Type: Double
Size: 8

​ 请注意,您也可以在泛型类的上下文之外,对特定类型使用泛型类型函数。例如,您可以编写:

varI: Integer;s: string;
beginI := Default(Integer);Show('Default Integer: ' + IntToStr(I));s := Default(string);Show('Default String: ' + s);Show('TypeInfo String: ' + GetTypeName(TypeInfo(string));

这是一个简单的输出:

Default Integer: 0 
Default String: 
TypeInfo String: string 

注解:您不能像上面的代码中的TypeInfo(s)那样将TypeInfo调用应用于变量,而只能将其应用于数据类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 数据存储

在Unity中&#xff0c;资源的存储是非常重要的&#xff0c;所以了解资源的存储方式是有必要的&#xff0c;接下来说明一个重要的部分。 1.Unity存储 Unity为我们提供了自带的永久存储方式&#xff0c;PlayerPrefs&#xff0c;使用方法可以参考我这篇文章..点击导航 当然&…

Zabbix6.0自动发现Linux服务器并添加主机

文章目录 一、整体流程二、操作过程 一、整体流程 Zabbix自动发现主机功能是Zabbix监控系统的一个重要功能&#xff0c;它能够自动发现并添加新的主机到监控系统中&#xff0c;从而减少人为繁琐的操作&#xff01; 步骤操作1️⃣ 第一步创建自动发现规则2️⃣ ​第二步创建自…

opengl 正交投影 透视投影 切换不显示解决

opengl 正交投影 透视投影 切换不显示解决 完整源代码: import random import sys from PyQt5 import QtWidgets, QtCore from PyQt5.QtWidgets import QMainWindow, QApplication, QVBoxLayout, QPushButton from PyQt5.QtCore import Qt, QSize from OpenGL.GL import * …

安卓事件交互(按键事件、触摸事件、手势识别、手势冲突处理)

本章介绍App开发常见的以下事件交互技术&#xff0c;主要包括&#xff1a;如何检测并接管按键事件&#xff0c;如何对触摸事件进行分发、拦截与处理&#xff0c;如何根据触摸行为辨别几种手势动作&#xff0c;如何正确避免手势冲突的意外状况。 按键事件 本节介绍App开发对按…

[qt] qt程序打包以及docker镜像打包

目录 一 环境准备: 1.1 qt环境 1.2 linuxdeplouqt打包工具 二 qt包发布: 2.1 搜索链接库 2.2 应用程序APP打包 2.3 发布 三 docker镜像包发布 3.1 环境准备 3.2 镜像生产脚本 3.3 加载镜像并运行docker容器 一 环境准备: qt环境linuxdeployqt打包工具docker环境 1…

demo xshell (程序替换 工作目录 内建命令)

1.程序替换 在学习完一些列的进程替换接口之后我们大概就能知道&#xff0c;我们的环境变量以及命令行参数是如何传递给子进程的&#xff0c;这些参数是我们在调用进程替换时就传给了子进程的数据。 那么如果我们自己要实现一个简单的命令行解释器&#xff0c;我们是不是首先…

stm32MP135裸机编程:使用USB/UART烧录程序到SD卡并从SD卡启动点亮一颗LED灯

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf STM32CubeProgrammer v2.16.0 烧录需要的二进制文件1 烧录到SD卡需要哪些文件 参考《轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序》&#xff0c;烧录需要的SD卡文件如下&#xff1a; &a…

教育的数字化转型——Kompas.ai如何变革学习体验

引言 在现代教育中&#xff0c;数字化转型逐渐成为提升学习效果的重要手段。随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;在教育领域的应用越来越广泛。本文将探讨教育数字化转型的发展趋势&#xff0c;并介绍Kompas.ai如何通过AI技术变革学习体验。 教育数…

【Python】易错点——数组;列表;内存分配

在很多其他语言中用到的数组&#xff0c;没有展现出比Python的列表结构有更强的性能。 在许多其他编程语言中&#xff0c;数组通常是一种基本的数据结构&#xff0c;它们在内存中以连续的方式存储数据&#xff0c;这使得数组在某些操作上具有较高的性能。例如&#xff0c;数…

LNMP配置

文章目录 一、相关概念CGI的由来FastCGIPHP-FPM 二、编译安装编译安装nginxyum安装mysql编译安装php配置nginx支持php解析增加数据库安装论坛 一、相关概念 CGI的由来 最早的Web服务器只能简单地响应浏览器发来的HTTP请求&#xff0c;并将存储在服务器上的HTML文件返回给浏览器…

gdb 【Linux】

程序发布方式&#xff1a;  1、debug版本&#xff1a;程序会被加入调试信息&#xff0c;以便于进行调试。  2、release版本&#xff1a;不添加任何调试信息&#xff0c;是不可调试   确定一个可执行程序是debug&#xff0c;还是release [cxqiZ7xviiy0goapxtblgih6oZ test_g…

LIMS系统在汽车第三方检测实验室的应用

随着汽车行业的快速发展&#xff0c;汽车第三方检测实验室的工作量不断增加&#xff0c;对实验室的管理效率和数据准确性提出了更高的要求。LIMS系统的引入可以实现实验室的全面数字化管理&#xff0c;提高工作效率&#xff0c;降低运营成本&#xff0c;并提升数据质量与决策支…

python科研做图系列之时序图的绘制——对比折线图

参考知乎 折线图 我需要从两个不同的excel都读取第一列作为时间列,第二列作为编码列。 在同一张图上画出两条时间序列的折线图 横坐标是分钟,纵坐标是编码 帮我画的好看一些,记得解决中文乱码问题 英文版折线图 ,先搞个英文版,导师要求中文的话,再换成中文版 impor…

[Algorithm][动态规划][完全背包问题][零钱兑换][零钱兑换Ⅱ][完全平方数]详细讲解

目录 1.零钱兑换1.题目链接2.算法原理详解3.代码实现 2.零钱兑换 II1.题目链接2.算法原理详解3.代码实现 3.完全平方数1.题目链接2.算法原理详解3.代码实现 1.零钱兑换 1.题目链接 零钱兑换 2.算法原理详解 思路&#xff1a; 确定状态表示 -> dp[i][j]的含义 dp[i][j]&am…

QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite用法

使用QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite数据库实现一个简单的界面查询 1. 创建Sqlite数据库&#xff0c;表 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "QSqlDatabase" #include "QSqlQuery&q…

【计算机毕业设计】273基于微信小程序的刷题系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

算法训练营day52

题目1&#xff1a;123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(), vector<int>(4,0));dp[0][0] -prices[0];dp[0][…

JavaSE面试

①.简述面向对象的三大特征 封装、继承、多态 1.封装&#xff1a; 概念&#xff1a; 是将类的某些信息隐藏在类的内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息的操作和访问。 好处 &#xff1a; ①便于修改&#xff0c;增强了代…

前端实现流文件下载

在现代Web开发中&#xff0c;经常会遇到需要从服务器下载文件的情况。有时候这些文件是事先存储好的&#xff0c;可以通过简单的URL链接直接下载&#xff1b;但有时候&#xff0c;我们需要从数据流中动态生成文件并将其提供给用户。本篇博客将介绍如何在前端实现流文件下载的完…

MySQL8基于GTID以及VIP实现高可用主从架构

jdbc客户端配置高可用以及故障切换 jdbc客户端实现故障切换 MySQL Connector/J 支持服务器故障转移。当底层活动连接发生与连接相关的错误时&#xff0c;就会发生故障转移 参考官网地址 jdbc:mysql://[primary host][:port],[secondary host 1][:port] jdbc客户端实现故障切…