Eugine Savin
-
Content Count
19 -
Joined
-
Last visited
Posts posted by Eugine Savin
-
-
Ha, delphi 10.4 has a bug here.
type iSomeInterface<T> = interface end; Type tSomeclass<T:iInterface>=CLass (tInterfacedObject, iSomeInterface<T>) Constructor Create(s: string); Function CreateNewInstance:iSomeInterface<T>; end; Function tSomeclass<T>.CreateNewInstance:iSomeInterface<T>; type TSelfClass = tSomeclass<T>; TSomeClassType = class of TSelfClass; // !!!!!!!!!!!! [dcc32 Error] Unit9.pas(36): E2021 Class type required begin result:=TSomeClassType(Self.Classtype).Create('s'); //Does not compile end;
-
cCircleZero: TCircle = (C: (x: 0; y: 0); Radius: 0.0);
- 1
-
Current output is 'ne', I think, it's a bug. If I explicitly set type of variable B to Currency - output will be 'eq' as expected. I use Delphi 10.4 (also please check this code in Delphi 11)
program Project3; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function GetCurrency: Currency; begin Result := 8.52; end; var A: Currency; begin A := GetCurrency; //var B: Currency := GetCurrency(); // 1 var B := GetCurrency(); // 2 if A = B then WriteLn('eq') else WriteLn('ne'); ReadLn; end.
-
Oh, sorry, my fault, I believe that I have similar code but it does not have generic constraints. Perhaps I ran into this issue earlier, but forgot about it
-
As least Delphi Tokio compiles this code successfully
-
if I pass set type into MyGenericMethod<T: record> - I get compile type error [dcc32 Error] Project2.dpr(28): E2512 Type parameter 'T' must be a non-nullable value type
Is it OK or compiler bug ??
program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TMyEnum = (en1); TMySet = set of TMyEnum; type TTestClass = class class procedure MyGenericMethod<T: record>; end; class procedure TTestClass.MyGenericMethod<T>; begin // end; begin try { TODO -oUser -cConsole Main : Insert code here } TTestClass.MyGenericMethod<TMySet>(); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
-
class function TNumbers.FromInteger<T>(AValue: Integer): T; type PSingle = ^Single; begin if TypeInfo(T) = TypeInfo(Single) then PSingle(@Result)^ := AValue else if TypeInfo(T) = TypeInfo(Integer) then PInteger(@Result)^ := AValue else raise Exception.Create('Error Message'); end;
-
type TNumbers = class public class function One<T>: T; end; { TNumbers } const OneSingle: Single = 1; OneInteger: Integer = 1; class function TNumbers.One<T>: T; type PT = ^T; begin if TypeInfo(T) = TypeInfo(Single) then Result := PT(@OneSingle)^ else if TypeInfo(T) = TypeInfo(Integer) then Result := PT(@OneInteger)^ else raise Exception.Create('Error Message'); end; ... FPen.Width := TNumbers.One<T>;
-
-
This shouldn't work. Make method Test virtual and override it in Test2
-
1 minute ago, Rudy Velthuis said:How would you do this in, say, C++?
In C++ there is not differences between functions and overloaded operators.
struct MyArray { public: template <std::size_t N> bool operator==(int (&rhs)[N]) { std::cout << N << '\n'; return true; } }; int main() { // your code goes here int arr1 [1] = {0}; int arr2 [2] = {0, 0}; MyArray myArr; if (myArr == arr1 && myArr == arr2) {} return 0; }
20 minutes ago, Rudy Velthuis said:And don't use operators.
Can you explain why you allow operators with dyn arrays, and do not allow ones with open arrays ?
-
1 minute ago, Rudy Velthuis said:it doesn't make sense to give operators open array parameters.
TMyArray = record .. end; const Arr1: array[0..1] of Integer = (..) const Arr2: array[0..2] of Integer = (..) var MyArray: TMyArray ..
I wanna have ability to compare if (MyArray == Arr1) or (MyArray = Arr2).. How can I get it without open arrays as operator parameters ?
-
1 minute ago, Rudy Velthuis said:But not open array arguments, IMO
What's problems with open arrays ? Anyway if I replace "array of Integer" by "TArray<Double>" r * [10.0] - compiled, but r = [10.0] is not ( E2001 Ordinal type required)
-
And main question, why
r := r * [10] // here [10] is array
and
b := r = [10] // here [10] is set
what's difference ??
-
44 minutes ago, Uwe Raabe said:because in the second case "[10]" is seen as a set constant by the compiler
Well, where is not "set of Integer", but code
var i: Integer; begin i := 10; b := r = [i]; end
is not compiled
-
Simple question, why "Multiply" operator works, and "Equal" does not. compiler give error "[dcc32 Error] Project1.dpr(33): E2015 Operator not applicable to this operand type"
program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TMyRecord2 = record public class operator Equal(const a: TMyRecord2; const b: array of Integer): boolean; class operator Multiply(const a: TMyRecord2; const b: array of Integer): TMyRecord2; end; class operator TMyRecord2.Equal(const a: TMyRecord2; const b: array of Integer): boolean; begin Result := True; end; class operator TMyRecord2.Multiply(const a: TMyRecord2; const b: array of Integer): TMyRecord2; begin Result := a; end; var b: boolean; r: TMyRecord2; begin try r := r * [10]; // this line is compiled b := r = [10]; // this line is not compiled except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
- 1
Compile time issue with RTTI, generic interface and type casting...
in RTL and Delphi Object Pascal
Posted
You can do it without TValue
if TypeInfo(T) = TypeInfo(Integer) then PInteger(@Result)^ := 10
else if TypeInfo(T) = TypeInfo(string) then PString(@Result)^ := 'Hello'