Про RAII вопрос имею.
Скажем есть две функции
void enter(CTX& ctx);
void leave(CTX& ctx);
где CTX есть некий объект структруа которого в данном контексте не важна.
Есть также большой набор функций с сигнатурами
void do_something(CTX& ctx, ....);
В каждой такой функции при входе нужно звать enter и соотв. при выходе (любом) leave.
Т.е. примерно так:
void do_something(CTX& ctx, ....)
{
enter(ctx);
...
if(cond) { leave(ctx); return; }
...
leave(ctx);
}
В классике это все делается путем RAII helper class:
struct context
{
CTX& ctx;
context(CTX& c):ctx(c) { enter(ctx); }
~context() { leave(ctx); }
}
Ну и соответсвенно:
void do_something(CTX& ctx, ....)
{
context _(ctx);
...
if(cond) return;
...
}
Вопрос состоит в следующем:
Каждая переменная типа context содержит ссылку (указатель de facto) на CTX увеличивая тем самым размер стека функции.
Можно ли как-нибудь избавитсься от этой context::ctx переменной?
Скажем в D я бы написал это как:
void do_something(CTX& ctx, ....)
{
enter(ctx); scope(exit) leave(ctx);
...
if(cond) return;
...
}
Т.е. без "прикапывания" (дублирования) ctx на стеке.
Уверен что в C++ такой кунштюк не сделать но вдруг? Например средствами C++0x ...