Re: Оптимизация кода
От: zaufi Земля  
Дата: 08.04.09 09:23
Оценка:
Здравствуйте, smj, Вы писали:

smj>Здравствуйте,


smj>помогите кто чем может ) с оптимизацией кода.

smj>Есть контейнер (не STL) при переборе элементов которого вызывается определённая сallback ф-я некоторого класса.
ну явно напрашивается решение с абстрагированием от конкретного callback'a... по сути итерационный алгоритм передеает туда 2 парамера -- контейнер (не пойму зачем) и запись из этого контейнера. простейший способ состоит в использовании функторов:
class CFoo
{
 template <typename Func> 
 HRESULT Iterate(Func f, /* ещё пара параметров */ )
 {
  подготовка, создание контейнера, заполнение и т.д.
  
  итерация по элементам контейнера, вызов callback
  for (...)
  {
    hRet = f(pContainer, pContainer[i]);
  }

  очистка
 }
}

функторы (в твоем случае имеющие 2 параметра) можешь создавать "на лету" делая binding необходимых тебе дополнительных параметров...

CFoo obj;

// call function w/o aux params
obj.Iterate(boost::bind(&another_obj::member_func, _1, _2));

// call function w/ one aux param
SomeParam p1;
obj.Iterate(boost::bind(&another_obj::member_func_with_param, _1, _2, p1));

// call function w/ two aux params
SomeParam p1;
SomeParam2 p2;
obj.Iterate(boost::bind(&another_obj::member_func_with_2_params, _1, _2, p1, p2));


альтернативный вариант состоит в написании итератора (совместимого с STLным) для твоего контейнера (используя для простоты например библиотечку boost::iterator)... в результате получишь возможность сувать свои итераторы в std:: алгоритмы...

PS: также луче избавиться от передачи контейнера в callback -- по хорошему все что должно быть нужно этой функции это элемент контейнера (ну или итератор на него)...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.