У меня есть программа с множеством структур, определяемых как статические массивы символов и записей (обычно состоящие из массивов char, но это не так важно).Могу ли я ограничить (компиляцию или время выполнения) родовое число как массив [0..n] из char
Я пытаюсь создать общий интерфейс для этих структур, чтобы они могли быть переданы на встроенную DLL.
Я могу обрабатывать записи всех типов с помощью ограничения <T: record>
, но array[0..n] of char
не соответствует правилу 'не-nullable value type'.
Я могу использовать неограниченные дженерики, объявляя типы для разных статических массивов (TMyArray = array[0..5] of char
- это прекрасно, поскольку он уже существует в существующем коде), но мне нужно потерять ограничение <T: record>
. Поскольку мой код не будет работать с классами или динамическими массивами, я бы хотел ограничить T
как статичным или статическим массивом символов.
Я могу иметь два конструктора с ограничением record
. то я могу проверить, что ним непринужденный тип представляет собой массив с помощью старого стиля RTTI:
var
l: PTypeInfo;
begin
l := TypeInfo(T);
assert(l.Kind = tkArray);
end;
, но я не думаю, что я могу проверить, что содержавшийся типом является символом? 2010 RTTI жалуется, что T должен быть классом, поэтому я не думаю, что это тоже. Я могу немного обойти его, создав записи, содержащие только мой статический массив символов, но это немного притворно и будет выглядеть довольно неуклюжим в коде.
можете ли вы преобразовать массив в расширенную запись с помощью класса-оператора? Неявные машинные приемы в и из массива? –
Я предполагаю, что это возможность, но их очень много, поэтому на самом деле не нужно создавать эту структуру для более 50 типов данных. Он предназначен только для внутреннего использования, поэтому проверка времени выполнения с использованием RTTI, как принято ниже, прекрасна до тех пор, пока компилятор не будет исправлен, и мы обновим его. –