对于这个模板,是否可以参数化uint32类型?
template test_t {
saved uint32 data;
}
我尝试使用param mytype = uint32
,但没有工作。有没有别的办法?
DML没有内置对泛型的支持,但是您可以通过使用param
和typeof
来模拟它们。然而,这确实有一些明显的缺点,通常是你在绝望时才会用到的东西。
template test_t {
param data_type_carrier;
#if (true) {
saved typeof(data_type_carrier) data;
}
}
group test is test_t {
// safe as this expression is never evaluated
param data_type_carrier = *cast(NULL, uint32 *);
}
#if (true)
可能会引起您的注意:这是一种防止DML试图使data
成为模板类型的一部分的hack。模板类型是在顶层计算和构造的,所以对象局部参数在构造过程中不在作用域中:如果没有#if (true)
, DML将拒绝模板,抱怨data_type_carrier
不在作用域中(这也适用于session
)。由于data
不是模板类型的一部分,这意味着您不能从test_t
值访问它。
local test_t x = cast(test, test_t);
local uint32 y = x.data; // error
同样,您不能利用参数化类型声明共享方法或类型化参数。然而,无类型参数、非共享方法和子对象是合理的,并且由于DML不尝试将这些成员添加到模板类型中,因此不需要#if (true)
hack来处理它们。