Каков синтаксис включения методов в вариантную запись?

StackOverflow https://stackoverflow.com/questions/2412603

Вопрос

У меня есть следующее определение записи

  E3Vector3T = packed record
  public
      x: E3FloatT;
      y: E3FloatT;
      z: E3FloatT;

      function length: E3FloatT;
      function normalize: E3Vector3T;
      function crossProduct( const aVector: E3Vector3T ): E3Vector3T;

      class operator add( const aVector1, aVector2: E3Vector3T ): E3Vector3T;
      class operator subtract( const aVector1, aVector2: E3Vector3T ): E3Vector3T;
      class operator negative( const aVector: E3Vector3T ): E3Vector3T;
      class operator multiply( const aVector: E3Vector3T; const aScalar: E3FloatT ): E3Vector3T;
      class operator divide( const aVector: E3Vector3T; const aScalar: E3FloatT ): E3Vector3T;
  end;

Я хотел ввести вариантную часть записи, чтобы иметь возможность доступа к трем элементам как по отдельности, так и в виде массива, т.е.

  E3Vector3T = packed record
  public
      case boolean of
          true: (
              x: E3FloatT;
              y: E3FloatT;
              z: E3FloatT;
          );
          false: (
              elements: packed array[0..2] of E3FloatT;
          );

      function length: E3FloatT;
      ..
  end;

Это не скомпилируется(функции нужен тип результата по длине функции).Что-то очевидно, что я делаю неправильно, или это не поддерживается?В этом случае есть ли какие-нибудь предложения по элегантному, но производительному способу доступа к отдельным полям в виде массива?

п.с.E3FloatT — это простой псевдоним типа Single.

Это было полезно?

Решение

Возможно, это ошибка компилятора, но он компилируется, когда методы объявляются перед вариантной частью.Это кажется разумным решением.

E3Vector3T = packed record
  public
      function length: E3FloatT;
      ..

      case boolean of
          true: (
              x: E3FloatT;
              y: E3FloatT;
              z: E3FloatT;
          );
          false: (
              elements: packed array[0..2] of E3FloatT;
          );
  end;

Другие советы

Переместите объявление функции наверх следующим образом:

  E3Vector3T = packed record
  public
      function length: E3FloatT;
      case boolean of
          true: (
              x: E3FloatT;
              y: E3FloatT;
              z: E3FloatT;
          );
          false: (
              elements: packed array[0..2] of E3FloatT;
          );

  end;

Это компилируется в Delphi 2010.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top