Оптимизация кода
От: smj  
Дата: 08.04.09 07:19
Оценка:
Здравствуйте,

помогите кто чем может ) с оптимизацией кода.
Есть контейнер (не STL) при переборе элементов которого вызывается определённая сallback ф-я некоторого класса. На данный момент ф-я перебора выглядит так:
class CFoo
{
 template <typename TCallee, HRESULT (TCallee::*pFunc)(CContainer*, CRecord*)> 
 HRESULT Iterate(TCallee* pCallee, /* ещё пара параметров */ )
 {
  подготовка, создание контейнера, заполнение и т.д.
  
  итерация по элементам контейнера, вызов callback
  for (...)
  {
    hRet = (pCallee->*pFunc)(pContainer, pContainer[i]);
  }

  очистка
 }
}

есть ещё вариант, где callback ф-я имеет дополнительный параметр:
class CFoo
{
 template <typename TCallee, typename TParam, HRESULT (TCallee::*pFunc)(CContainer*, CRecord*, TParam)>
 HRESULT Iterate(TCallee* pCallee, TParam pParam /* ещё пара параметров */ )
 {
  здесь внутри всё то же самое, единственно что меняется это вызов callback
  for (...)
  {
    hRet = (pCallee->*pFunc)(pContainer, pContainer[i], pParam);
  }
 }
}

Понятно, что ещё возможны варианты с callback'ами const типа:
HRESULT (TCallee::*pFunc)(CContainer*, CRecord*) const
HRESULT (TCallee::*pFunc)(CContainer*, CRecord*, TParam) const


и каждый раз единственное изменение это строка вызова, то есть 99% кода дублируется.

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

Есть другая идея, только с реализацией что-то никак. Сделать одну единтственную ф-ю, которая занимается перебором, и вызов callback'a как-то (как ?) настраивать в зависимости от обстоятельств.

Может быть есть и другие, лучшие или очевидные варианты решения проблемы.

Заранее благодарен за идеи и комментарии )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.