여기에 재귀적인 함수가 있지만 재귀 적으로 만들지는 않을 것입니다. 어떻게 잘 모르겠다.이 기능을 재귀 적으로 만들지 않습니까?
void AguiWidgetManager::recursiveRender(const AguiWidget *root)
{
//recursively calls itself to render widgets from back to front
AguiWidget* nonConstRoot = (AguiWidget*)root;
if(!nonConstRoot->isVisable())
{
return;
}
clip(nonConstRoot);
nonConstRoot->paint(AguiPaintEventArgs(true,graphicsContext));
for(std::vector<AguiWidget*>::const_iterator it =
root->getPrivateChildBeginIterator();
it != root->getPrivateChildEndIterator(); ++it)
{
recursiveRender(*it);
}
for(std::vector<AguiWidget*>::const_iterator it =
root->getChildBeginIterator();
it != root->getChildEndIterator(); ++it)
{
recursiveRender(*it);
}
}
솔루션이 반복자로 작동하지 않을 경우에도 괜찮습니다.
감사 일반적으로
당신이 알다시피, 만약 당신이 그 기능을 비 재귀 적으로 만들면 매우 불명확합니다. –
이유는 무엇입니까? 아마도 재귀가 이것을 수행하는 가장 쉬운 방법이라고 생각합니다. 반복적 인 솔루션은 스택을 사용하고 수동으로 재귀를 구현합니다. 또한,'std :: for_each (root-> getChildBeginIterator(), root-> getChildEndIterator(), recursiveRender);'는 여러분이 가지고있는 것보다 조금 더 멋지게 보입니다. –
@Chris Lutz'for_each'는 더 멋지게 보일지 모르지만 함수가 멤버 함수이기 때문에 틀린 것이 아니라면'mem_fun_ref' 바인더 나 비슷한 것을 필요로합니다. –