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