То, почему я получаю “тип, не имеет никакого typeinfo” ошибка с перечислимым типом

возможно, станд.:: stringstream вместо этого?

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

19
задан Rex M 15 September 2009 в 04:13
поделиться

2 ответа

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

Если это определенно. значения являются важными или желательными, «неиспользуемые» члены перечисления должны быть вставлены для «дополнения» перечисления по мере необходимости. например (дополнительный отступ только для выделения):

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue
              );

Затем можно использовать поддиапазон для «фильтрации» неиспользуемого начального значения:

   TValidMyEnum = meFirstValue..meThirdValue;

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

Поддиапазона недостаточно, если перечисление содержит «пробелы»:

  type
    TMyEnum = (
                meNOTUSED1,   {= 0}
               meFirstValue,  {= 1} 
               meSecondValue,
               meThirdValue,
                meNOTUSED2,
               meFinalValue   {= 5}
              );

В этом случае нет простого способа расширить проверку диапазона времени компиляции, чтобы исключить неиспользуемые элементы, но пара типов наборов упростит выполнение любых необходимых проверок времени выполнения :

  type
    TMyEnums = set of TMyEnum;

  const
    meNOTUSED      = [meUNUSED1, meUNUSED2]; //  .. etc as required
    meValidValues  = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED;


  if NOT (aValue in meValidValues) then
     // etc
21
ответ дан 30 November 2019 в 02:29
поделиться

Несмежные перечисления и перечисления, которые не начинаются с нуля, не имеют typeinfo. Для реализации typeinfo он должен быть в формате, отличном от существующего tkEnumeration , из-за проблем с обратной совместимостью.

Я подумал о реализации tkDiscontiguousEnumeration (или, возможно, лучше named member) для Delphi 2010, но выгода казалась небольшой, учитывая их относительную редкость и трудности с перечислением - как эффективно кодировать диапазоны? Некоторые кодировки лучше для одних сценариев, хуже для других.

32
ответ дан 30 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: