gpt4 book ai didi

delphi - Delphi 是否支持泛型方法的显式特化?

转载 作者:行者123 更新时间:2023-12-03 19:13:06 26 4
gpt4 key购买 nike

在 C++ 中,您可以为模板函数显式定义唯一的特化,例如(至 steal an example)

// A generic sort function 
template <class T>
void sort(T arr[], int size)
{
// code to implement Quick Sort
}

// Template Specialization: A function
// specialized for char data type
template <>
void sort<char>(char arr[], int size)
{
// code to implement counting sort
}

有没有一种方法可以用 Delphi 泛型方法做同样的事情?当我尝试

function TryStrConv<T>(S: string; var Val: T): boolean;
function TryStrConv<float>(S: string; var Val: float): boolean;

我收到关于如何使用 Overload 指令的警告。

我希望得到的是一种编写通用 TryStrConv 的方法,其中默认实例化返回 false 并且不执行任何操作,而我想明确提供的 int 和 float 实例化使用TryStrToIntTryStrToFloat。或者,如果我缺少 Delphi 中的通用转换工具,我希望得到指点。

谢谢。

最佳答案

您不能在声明时已经填写通用参数。您要么重载一种通用方法,要么重载一种非通用方法,如下所示:

function TryStrConv<T>(S: string; var Val: T): boolean; overload;
function TryStrConv(S: string; var Val: Extended): boolean; overload;

但需要注意的是,它只会为 Extended 选择非通用类型,而不是 Delphi 拥有的其他浮点类型,如 Double 或 Single。

另一种方法是,如果您使用的是 Delphi XE7 或更高版本,则可以使用新的内部函数来分支通用方法实现(它在编译时得到解析,并且未执行的路径被消除)。例如,它可能看起来像这样(我省略了 TryStrConv 方法的类型,但您知道在 Delphi 中您不能拥有通用的独立例程,但它们必须是某种类型的方法,即使只是静态的):

function TryStrConv<T>(S: string; var Val: T): boolean;
begin
if GetTypeKind(T) = tkFloat then
begin
// do stuff with val being a float type, still need to handle the different float types though
case GetTypeData(TypeInfo(T)) of
ftDouble: DoStuffWithDouble;
// if you need to pass Val here you might need to do some pointer
// ref/deref hardcasts like PDouble(@Val)^ because otherwise you
// are not allowed to cast type T to Double (or any other type)
....
end;
else
Result := False;
end;

关于delphi - Delphi 是否支持泛型方法的显式特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50136259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com