gtag_report_conversion conversiones configurar adwords delphi delphi-2006

delphi - conversiones - ¿Cómo puedo definir operadores de conversión implícitos para registros mutuamente dependientes?



configurar conversiones adwords (2)

Es posible que puedas hacer esto con los ayudantes de registro.

A continuación se muestra lo que recientemente hice para evitar la imposibilidad de tener una declaración de registro de forward record .

Utiliza el constructo de record helper , que, al igual implicit type casts , también tiene inconvenientes.
El más importante es que solo se aplicará el record helper más cercano para un tipo de record particular.

type TIpv4Address = record strict private FAddress: TIpv4Quad; FMask: TIpv4Quad; private class function CreateInternal(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static; public class function Create(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static; class function Count(const IP_ADDR_STRING: _IP_ADDR_STRING): Integer; static; property Address: TIpv4Quad read FAddress; property Mask: TIpv4Quad read FMask; end; TIpv4AddressList = array of TIpv4Address; TIpv4AddressHelper = record helper for TIpv4Address class function CreateList(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4AddressList; static; end;

Lo usas así:

function TAdapterInfo.GetIpAddressList: TIpv4AddressList; begin Result := TIpv4Address.CreateList(AdapterInfos.IP_ADAPTER_INFO[Index].IpAddressList); end;

--jeroen

Estoy utilizando la sobrecarga del operador para los registros en Delphi 2006. (No responda esta pregunta diciéndome que no lo haga).

Tengo dos tipos de registro con el operador implícito sobrecargado. Ambos están solo en la implementación del módulo, no expuestos a través de la interfaz.

Mi problema es que, ahora que dependen mutuamente, no sé cómo reenviar declarar el segundo tipo al compilador. Sé cómo hacer esto con funciones, procedimientos y clases, pero no con registros.

Aquí hay un ejemplo simplificado de lo que estoy tratando de hacer:

implementation type TMyRec1 = record Field1 : Integer; class operator Implicit(a: TMyRec2): TMyRec1; // <---- Undeclared Identifier here. end; TMyRec2 = record Field2: Integer; class operator Implicit(a: TMyRec1): TMyRec2; end; class operator TMyRec1.Implicit(a:TMyRec2): TMyRec1; begin Result.Field1 := a.Field2; end; class operator TMyRec2.Implicit(a:TMyRec2): TMyRec2; begin Result.Field2 := a.Field1; end;


No puede tener declaraciones forward para los tipos de registro. Define ambos operadores Implicit en el segundo tipo:

type TMyRec1 = record Field1 : Integer; end; TMyRec2 = record Field2: Integer; class operator Implicit(a: TMyRec2): TMyRec1; class operator Implicit(a: TMyRec1): TMyRec2; end;

Citando de la ayuda :

Las conversiones implícitas se deben proporcionar solo donde sea absolutamente necesario, y se debe evitar la reflexividad. Lo mejor es dejar que el tipo B se convierta implícitamente en el tipo A, y que el tipo A no tenga conocimiento del tipo B (o viceversa).