У меня есть алгоритм расчета в Delphi с несколькими различными опциями, и мне нужно попробовать каждую комбинацию опций, чтобы найти оптимальное решение.
TMyOption = (option1, option2, option3, option4);
TMyOptions = set of TMyOption;
Я задавался вопросом об использовании целочисленного цикла для их перечисления:
for EnumerationInteger := 0 to 15 do begin
Options := TMyOptions(EnumerationInteger);
end;
Это не компилируется. Мне было интересно, был ли какой-нибудь довольно простой метод преобразования из Integer в Set (большинство вопросов в Интернете пытаются пойти другим путем, от Set до Integer), и если да, то что это?
Другая возможность состоит в том, чтобы просто использовать Integer в качестве битового поля:
C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;
, а затем проверить членство с помощью побитового и:
if (Options and C_Option2) > 0 then begin
...
end;
Я пробовал это, и это работает, но кажется, что работа с наборами будет более естественной и лучше использовать систему типов (даже если я выйду за пределы указанной системы типов для перечисления наборов).
Есть ли лучший / более безопасный способ перечислить все возможные комбинации множеств, чем перечисление базового целочисленного представления?
Примечания:
- Я знаю, что целочисленные значения набора не гарантированы в теории (хотя я подозреваю, что они на практике, если вы не играете с нумерацией перечисления).
- Может быть более четырех вариантов (да, я знаю, что он растет в геометрической прогрессии, и если вариантов слишком много, алгоритм может работать вечно).