artbear писал(а) 27. Февраля 2008 :: 09:11:Народ, руки давно чешутся каким-то отрефакторить/упростить код наподобие следующего:
в ComponentClass.cpp
Например, можно использовать шаблоны. Для функционала обхода объектов заводим шаблонную функцию:
template<class Functor_t, class FunctorSelf_t>int CComponentClass::CallMethod(int iMethodNum, Functor_t const &Func, FunctorSelf_t const &Self)
{
iMet = defFnNames->Size();
if (iMethodNum >= iMet)
{
CONST_ITER_CONT iEnd(vecOfBaseCont.end());
for (CONST_ITER_CONT iter = vecOfBaseCont.begin(); iter != iEnd; ++iter)
{
CBLContext *pCont = *iter;
int nNMethods = pCont->GetNMethods();
if (iMethodNum < iMet+nNMethods)
{
int nMeth = iMethodNum - iMet;
return Func (pCont, nMeth);
}
iMet += nNMethods;
}
return 0;
}
else
return Self (iMethodNum);
}
Тогда метод "КакойТоМетод" выглядит так:
int CComponentClass::КакойТоМетод(int iMethodNum, Параметры...)
{
return CallMethod (
boost::bind (&CBLContext::КакойТоМетод, _1, _2, Параметры...),
boost::bind (&CComponentClass::КакойТоМетодОбработчик, this, _1, Параметры...));
}
Проблемы тут, в общем-то, две:
1) VC6. Как этот недокомпилятор сможет такое переварить - неизвестно. Хотя boost::bind вроде бы работает в VC6. Впрочем, на крайний случай всегда можно будет написать свой функтор.
2) При создании функторов при помощи boost::bind всегда будут инициализироваться оба функтора (в каждый из них будут копироваться параметры и т.д.). Впрочем, если CallMethod полностью заинлайнится, накладных расходов не будет. В IC, скорее всего, так и будет. Что будет в VC6 - тайна покрытая мраком.