Перечислить возможные заданные значения в Delphi

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

TMyOption = (option1, option2, option3, option4);
TMyOptions = set of TMyOption;

Я подумал об использовании цикла Integer для их перечисления:

for EnumerationInteger := 0 to 15 do begin
    Options := TMyOptions(EnumerationInteger);
end;

Это не компилируется. Меня интересовало, существует ли какой-нибудь довольно простой метод преобразования из Integer в Set (большинство вопросов в Интернете пытаются пойти другим путем, из Set в Integer), и если да, то что это такое?

Другая возможность - просто использовать целое число как битовое поле:

C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;

, а затем проверить членство с помощью побитового и:

if (Options and C_Option2) > 0 then begin
    ...
end;

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

Есть ли лучший / более безопасный способ перечислить все возможные комбинации наборов, чем перечисление базового целочисленного представления?

Примечания:

  1. Я знаю, что целочисленные значения набора теоретически не гарантированы (хотя я подозреваю, что они есть на практике, если вы не играете с нумерацией перечислений).
  2. Может быть более четырех вариантов (да, Я знаю, что он растет экспоненциально, и если будет слишком много вариантов, алгоритм может занять вечность).
6
задан Jonathan Morgan 4 November 2010 в 00:06
поделиться