RAII, scope(exit) ...;
От: c-smile Канада http://terrainformatica.com
Дата: 18.08.10 21:44
Оценка: -1
Про 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 ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.