int main(void) {
try {
Framework f ;
f.init(...);
AppMain(f);
}
catch(...) {
if(f)
f.term();
errstr << "fatal err" << endl;
return 1;
}
return 0;
}

void AppMain(framework & f) {
SPScene s(new RootScene);
while(s) {
s->attach(f);
s->run();
s->detach(f)
s = s->getNextScene()
}
}

これでいいじゃん
引数で渡すっていっても毎フレーム律儀に引数で渡す必要はない