Здравствуйте, 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 -- по хорошему все что должно быть нужно этой функции это элемент контейнера (ну или итератор на него)...