作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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 实例化使用TryStrToInt
和 TryStrToFloat
。或者,如果我缺少 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/
我是一名优秀的程序员,十分优秀!