Выше в примерчиках возникает некая инверсия дизайна на фоне распространённых решений в других языках -- вместо прямого доступа к контейнеру данных правят бал "токены". В результате, в самом деле, удобно и просто, как с обычными массивами, с контролем типов.
Однако, обратная сторона медали. Всё-таки, без дженериков нет полного контроля типов (в смысле ряд согласований типов происходит "вручную" в runtime). В оригинале полно оптимизаций на ассемблере (в т.ч. и для обхода языковых ограничений/особенностей, лишнего системного runtime-контроля), но такие приёмы, всё же, есть обман языковых средств.

Для своих же типов-"токенов" необходимо уже самостоятельно организовывать обвёртки в таком стиле (в данном случае с косвенным доступом, или же необходимо создавать свою реализацию типа-столбца с хранением данных по месту внутри контейнера по аналогии с типами-столбцами ("токенами") над встроенными базовыми типами):
## Код:
```
procedure TestArrayOfPointers;
var
  p: TTPointer;
  i: integer;
  sum, n: double;
begin
  writeln('test vector of Pointer');
  p := TTPointer.create(TCVector);

  // alloc memory for items
  for i := 0 to 999 do
    p.Add(allocmem(SizeOF(double)));

  // fill allocated memory with random values and find SUM
  sum := 0;
  for i := 0 to p.count-1 do
  begin
    n := random*1000;
    sum := sum + n;
    double(p[i]^) := n;
  end;

  // check sum
  n := 0;
  for i := 0 to p.count-1 do
    n := n + double(p[i]^);
  assert(n=sum);

  // free allocated memory
  for i := 0 to p.count-1 do
    FreeMem(p[i]);

  p.free;
  writeln('ok');
end;
```
