【发布时间】:2017-05-31 13:06:35
【问题描述】:
我尝试构建一个通用类(例如 Set-Class)。这个类应该有一个函数“AsString”。但在其中我需要类型转换为字符串。 如何声明这种类型转换?
短代码:
generic TSet<_T> = class
private
FList: array of _T;
public
function AsString:string;
end;
TSetDouble = specialize TSet<double>;
function TSet.AsString: string;
var i:integer;
begin
result := '';
for i := 0 to Length(FList) - 1 do
result := result + IntToStr(i) + ' ' + string (FList[i]) + #13#10;
end;
我需要一种方法将 FList[i] 类型转换为每个“已知”特殊类型的字符串(当然:每种类型都需要自己的运算符重载)。 像
operator string(const X:integer):string;
begin result := IntToStr(x);end;
operator string(const X:TMyRecord):string;
begin result := IntToStr(MyRecord.Number) + MyRecord.Text;end;
有什么想法吗?
【问题讨论】:
-
我删除了运算符重载标签。问题不在于运算符重载。这是关于泛型的。它们不是一回事。
-
没有。重载适用于您定义的有限数量的特定类型。您的代码是通用的,需要适用于任何类型。重载你将一事无成。你要求一个通用的解决方案。我在第一条评论中提出了这一点。我认为您根本不了解通用的含义。在您完全掌握之前,我们将绕着圈子转圈圈。
-
@Abelisto 对泛型没有帮助
-
@Abelisto 好的,所以您同意运算符重载无助于解决问题中提出的问题
-
@Abelisto 问题是关于泛型的。所以任意类型都需要它,否则它不会编译。可能最好的玩具是一些基于 RTTI 的类型嗅探,但重载无济于事。而且我认为 fpc 无论如何都没有强大的 RTTI,所以这是行不通的。
标签: operator-overloading lazarus freepascal