如何在Ada泛型包中声明子程序访问类型的形式参数并进行空值判断?
解决Ada泛型包中访问类型空值检查的问题
你的问题核心在于泛型形式参数的声明范围太宽泛:你把Func_Type定义成了private类型,而Ada的private类型涵盖了所有数据类型(比如整数、字符串、普通记录等),这些非访问类型根本不支持和null进行相等性比较,所以编译器才会抛出错误。
要满足「形式参数为子程序访问类型并能做空值检查」的需求,你需要把泛型参数明确限定为访问类型(或更具体的子程序访问类型),下面是两种常用的正确写法:
1. 通用访问类型声明
这种写法允许任何访问类型(包括子程序访问类型、对象访问类型)作为实参传入,适用性更广:
generic type Func_Type is access type; -- 明确限定为访问类型 package Gen_Package is function Check(Func : Func_Type) return Boolean is (Func = null); end Gen_Package;
2. 特定子程序访问类型声明
如果你需要严格限定实参是某类特定签名的子程序访问类型,可以直接在泛型参数里指定子程序的签名,比如无参数的过程访问类型:
generic -- 可根据实际需求调整子程序签名,比如带参数/返回值的function type Func_Type is access procedure; package Gen_Package is function Check(Func : Func_Type) return Boolean is (Func = null); end Gen_Package;
如果你的子程序有参数或返回值,只需修改access procedure后的签名即可,例如:
type Func_Type is access function (Input : Integer) return String;
调整后,泛型包的实参必然是支持null比较的访问类型,Func = null的写法会被编译器认可,空值检查也能正常工作。
内容的提问来源于stack exchange,提问作者user15552120
相关产品推荐
相关产品推荐

