У меня есть две (у меня есть больше, но, например, было бы достаточно) oveloaded функции:
interface
function MyFunc(Value:Integer):Integer;overload;
function MyFunc(Value:Double):Double;overload;
implementation
function MyFunc(Value:Integer):Integer;
begin
MyFunc:=Math.Ceil( {Do some extra complicated Math calcs}
*
MyFunc( {¿How to Type Cast as Double?} Value )
);
end;
function MyFunc(Value:Double):Double;
begin
MyFunc:={Do some Math calcs with Value};
end;
Как можно в Typecast Integer на Double?
Я ненавижу ставить ´ (1.0 * Value) ´ или ´ (0.0 + Value) ´, который использует меньше процессорного времени, должен существовать другой способ сделать это.
ВНИМАНИЕ: я имею в виду typecast на этом звонке !!!
ВНИМАНИЕ: вызов находится на перегруженной функции, один вызывает другую
Надеюсь, кто-нибудь найдет способ, потому что, если поставить «MyFunc ((Double) Value)»), говорится, что недействительный тип приведен ... почему, черт возьми, приведение целого числа к двойному невозможно? двойник может хранить целое число ... также больше, при назначении он приводит его напрямую ... «MyVarOfTypeDouble: = MyvarOfTypeInteger;» работает отлично.
Проблема связана с перегруженными функциями ... он не знает, что я хочу вызвать Double version one ... вот почему требуется приведение ...
Другими словами ... это будет работать как шарм:
interface
function MyFunc_Integer(Value:Integer):Integer;
function MyFunc_Double(Value:Double):Double;
implementation
function MyFunc_Integer(Value:Integer):Integer;
begin
MyFunc_Integer:=Math.Ceil( {Do some extra complicated Math calcs}
*
MyFunc_Double(Value)
);
end;
function MyFunc_Double(Value:Double):Double;
begin
MyFunc_Double:={Do some Math calcs with Value};
end;
Смотрите, если имена функций различны, нет необходимости приводить ... пока я не нашел лучшего решения, я должен бояться, что буду использовать ´ (0.0 + Value) ´ там, где оно должно работать (но не работает) ´ ( Double) значение´, где значение типа Integer.
Так что мой ответ ... вместо того, чтобы ставить код ´ (Double) SomethingOfTypeInteger´ (это должно работать, но complier не нравится) ... ставить этот другой код ´ (0.0 + SomethingOfTypeInteger) ´, я рекомендую не использовать ´ (1.0 * SomethingOfTypeInteger) ´, поскольку оно гораздо менее эффективно ...
Никогда не думайте о создании такой функции (она также хуже, чем 1,0 * Значение):
function ConvetIntegerToDouble(Value:Integer):Double;
begin
ConvetIntegerToDouble:=Value;
end;
Эта функция прекрасно работает ... но занимает намного больше времени, чем установка '0.0 + значение '.
Теперь очень, очень ... многим очень умным людям ... посмотрите этот (очень уродливый) код:
interface
function MyFunc(Value:Integer):Integer;overload;
function MyFunc(Value:Real48):Real48;overload;
function MyFunc(Value:Real):Real;overload;
function MyFunc(Value:Double):Double;overload;
procedure CanYouGuess;
implementation
var
MyVarOfTypeDouble:Double;
function MyFunc(Value:Integer):Integer;
begin
MyFunc:=Round(MyFunc(1.0+Value));
end;
function MyFunc(Value:Real48):Real48;
begin
MyFunc:=MyFunc(2.0+Value);
end;
function MyFunc(Value:Real):Real;
begin
MyFunc:=MyFunc(4.0+Value);
end;
function MyFunc(Value:Double):Double;
begin
MyFunc:=(8.0+Value);
end;
procedure CanYouGuess;
var
MyVarOfTypeReal48:Real48;
MyVarOfTypeReal:Real;
begin
MyVarOfTypeDouble:=MyFunc( 0 ); // What value will be on MyVarOfTypeDouble?
MyVarOfTypeReal48:=0;
MyVarOfTypeDouble:=MyFunc(MyVarOfTypeReal48); // What value will be on MyVarOfTypeDouble?
MyVarOfTypeReal:=0;
MyVarOfTypeDouble:=MyFunc(MyVarOfTypeReal); // What value will be on MyVarOfTypeDouble?
MyVarOfTypeDouble:=MyFunc(0.0); // What value will be on MyVarOfTypeDouble?
end;
Теперь попробуйте угадать значения ... читая код, не понятно, какие вызовы должны идти ... я передаю целое число, затем в версии с целым числом oveload ... которая называется ... перегружена Real48 или реальная или Двойной? ... то же самое относится и к прохождению Real48, а также к прохождению Real ...
Компилятор вообще не обнаружил ошибки ... но я не знаю, какая (если только одна) будет вызвана ... без трассировки, конечно !!! ты можешь?
В таких ситуациях явное приведение было бы замечательно работать ...
Обратите внимание, я поставил 1.0+, 2.0+, 4.0+, 8.0+ ... степеней 2 ... так что можно увидеть любую сумму любого или некоторых из них ... если результат равен 15 ... все из них должны были быть запущены ... если 3 только 1.0 и 2.0, и т. д ... двоичный режим !!! например, вес битов и т. д. ... это просто для того, чтобы показать, как код может стать слишком сложным ... просто потому, что перегруженная функция должна иметь разные параметры ...
Это недопустимо, поскольку компилятор не знает, какой из них вызывать:
interface
function MyFunc(Value:Double):Integer;overload;
function MyFunc(Value:Double):Real48;overload;
function MyFunc(Value:Double):Real;overload;
function MyFunc(Value:Double):Double;overload;
Да, компилятор довольно глупый ... его можно скомпилировать только в тех случаях, когда MyFunc используется по заданию .... см. Этот код:
MyVarOfTypeReal48:=MyFunc(1); // It can know return value must be Real48, so call that one... but compiler is not so Intelligent
В таких случаях может быть известно, какой из них вызывать .... проблема в:
MyVarOfTypeInteger:=Round(5*MyFunc(1)+MyFunc(2)*1.3); // This is problematic, first one could be understod as Integer version, second one as ... as what? Real, Real48 or Double? not possible to know... that is why compiler does not like such overloaded (with same arguments).
Надеюсь, это поможет!