Всем привет!
Может быть вопрос совершенно ламерский, но вот сижу-торможу и никак не сообразить...
Есть функция примерно следующего вида:
void f(double *pArray,int mode)
{
for (int k=0; k<K; k++)
{
Class *pObj=GetObj(k);
for (int i=From(k); i<To(k); i++)
{
if (!Condition(i))
continue;
switch (mode)
{
case 0:
pObj->Fun0(pArray[i]);
break;
case 1:
pObj->Fun1(pArray[i]);
break;
case 2:
pObj->Fun2(pArray[i]);
break;
case 3:
pObj->Fun3(pArray[i]);
break;
}
}
}
}
Т.е. в нее передается длинный массив, диапазоны индексов которого соответствуют некотором объектам.
Внутри каждого диапазона перебираются элементы массива и для тех из них, которые удовлетворяют некому условию, вызывается тот или иной метод соответствующего объекта.
Поскольку массив длинный, и функция вызывается часто, хочется, чтобы работала она по возможности быстрее. В этом смысле от ветвления внутри цикла хотелось бы избавиться. Но писать четыре совершенно идентичные за исключением имени методов Fun0-Fun3 функции неохота. Можно, конечно, вынести switch во внешний цикл, но это некая полумера — и код дублируется достаточно сильно, и если диапазонов много и они короткие — то прирост эффективности небольшой...
Подскажите, можно ли это эффективно сделать по-другому, без ненужного дублирования кода?