Вопрос
У меня иногда бывает сложный итерационный процесс, который должен повторяться в коде несколько раз, но выражение, которое выполняется на каждой итерации, отличается в разных местах кода.Необходимость переписывать итерационный процесс везде уродлива и подвержена ошибкам.Как я могу просто обернуть этот процесс итерации?
Пример
Рассмотрим, например, эту относительно сложную итерацию
std::string bitmask(K, 1); // K leading 1's
bitmask.resize(N, 0); // N-K trailing 0's
// print integers and permute bitmask
do {
// Loop through BIG and SMALL indices
for (size_t BIGindex = 0; BIGindex < nbBigs; ++BIGindex)
{
size_t nbSmalls;
if (BIGindex == nbBigs)
{
nbSmalls = nbSmallsOfLastBig;
} else
{
nbSmalls = nbSmallsStandard;
}
for (size_t SMALLindex = 0; SMALLindex < nbSmalls; ++SMALLindex)
{
// doStuff with bitmask, BIGindex and SMALLindex
}
}
} while (std::prev_permutation(bitmask.begin(), bitmask.end()));
Как определить команду/ псевдоним (из-за отсутствия лучшего слова), например, doComplexItered, который превращает все эти итерации в более простую команду.Что-то вроде
doComplexIteration
{
// doStuff with bitmask, BIGindex and SMALLindex
}
Одно не вполне удовлетворительное решение
Один из способов сделать это - обернуть вещи, которые нужно выполнить, в такую функцию, как
void doComplexIterationOnFunction(void (*doStuff)(std::string bitmask, size_t BIGindex, size_t SMALLindex))
{
std::string bitmask(K, 1); // K leading 1's
bitmask.resize(N, 0); // N-K trailing 0's
// print integers and permute bitmask
do {
// Loop through BIG and SMALL indices
for (size_t BIGindex = 0; BIGindex < nbBigs; ++BIGindex)
{
size_t nbSmalls;
if (BIGindex == nbBigs)
{
nbSmalls = nbSmallsOfLastBig;
} else
{
nbSmalls = nbSmallsStandard;
}
for (size_t SMALLindex = 0; SMALLindex < nbSmalls; ++SMALLindex)
{
(*doStuff)(bitmask, BIGindex, SMALLindex);
}
}
} while (std::prev_permutation(bitmask.begin(), bitmask.end()));
}
, а затем вызвать его как
doComplexIterationOnFunction(doSpecificStuff);
, однако, это заставляет меня систематически переносить любой код, который я хотел бы выполнять на каждой итерации, в функцию, которая немного громоздка инемного глупо, так как иногда код очень короткий.