Добавление символьных значений в универсальный тип - PullRequest
1 голос
/ 10 ноября 2011

Какой универсальный тип мне следует использовать, если мне нужно присвоить ему символьное значение?
Сейчас я использую тип Char is(<>); в общем объявлении,
и назначьте значение символа следующим образом:

XY:GenericChar;
CharacterVariable: Character:='A';

XY:=GenericChar'Value(Character'Image(CharacterVariable));

Это работает, но я думаю, что должен быть лучший способ.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Вы можете использовать 'Pos и 'Val.

Преобразование между несвязанными типами перечисления нетривиально. Лучше всего использовать функцию преобразования, например:

generic
   type Generic_Char is (<>);
   with function To_Generic_Char (Source : Character) return Generic_Char is <>;
package Foo is
...

Таким образом, ваш универсальный пакет не будет заботиться о конвертации.

Для создания экземпляра пакета вам необходимо создать функцию.

1 голос
/ 10 ноября 2011

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

По большей части это означает, что вы можете назначать Char s, вы можете сравнивать их и иметь доступ к любому атрибуту.доступно для "дискретных".Проверяя нашу удобную онлайновую страницу LRM на предмет языковых атрибутов (оставьте эту закладку при работе с обобщениями), ищите те, которые работают с "дискретными" или "скалярными" объектами / типами, мы видим, что этовключает в себя:

  • 'first
  • ' image
  • 'last
  • ' max
  • 'min
  • 'pred
  • ' диапазон
  • 'succ
  • ' val
  • 'значение
  • (различное wide_ варианты' изображенияи 'значение)
  • Обычные подозрения, доступные для всех объектов любого типа (например, "размер", ввод и т. д.)
...