finalizer in C++
От: greenpci  
Дата: 15.06.15 11:39
Оценка:
Нужен финалайзер и не хочется создавать еще одно энтити для этого.

Надо вызать это перед выходом из блока.
in.SetEOFHandler(nullptr);


Насколько уродливо такое решение?
{
  in.SetEOFHandler(PartialPacketHandler);
  static int dummy = 0; // used to initialize std::unique_ptr but it will not be deleted
  auto deleter = [&in](int *p){in.SetEOFHandler(nullptr);};
  std::unique_ptr<int, decltype(deleter)> clean_up(&dummy, deleter);
  DoSomething(); // throws
}


Может есть лучше способ?
Re: finalizer in C++
От: uzhas Ниоткуда  
Дата: 15.06.15 11:45
Оценка: 1 (1)
Здравствуйте, greenpci, Вы писали:

G>Может есть лучше способ?


почитайте здесь: http://rsdn.ru/forum/cpp/5991672.flat.1
Автор: Evgeny.Panasyuk
Дата: 23.03.15
Re: finalizer in C++
От: Evgeny.Panasyuk Россия  
Дата: 15.06.15 11:46
Оценка: 1 (1)
Здравствуйте, greenpci, Вы писали:

G>Насколько уродливо такое решение?

G>
G>{
G>  in.SetEOFHandler(PartialPacketHandler);
G>  static int dummy = 0; // used to initialize std::unique_ptr but it will not be deleted
G>  auto deleter = [&in](int *p){in.SetEOFHandler(nullptr);};
G>  std::unique_ptr<int, decltype(deleter)> clean_up(&dummy, deleter);
G>  DoSomething(); // throws
G>}
G>


Настолько уродливо, что я бы предпочёл как ты говоришь "создавать еще одно энтити".

G>Может есть лучше способ?


scope(exit)
Автор: Evgeny.Panasyuk
Дата: 23.03.15

{
    in.SetEOFHandler(PartialPacketHandler);
    scope(exit)
    {
        in.SetEOFHandler(nullptr);
    };
    DoSomething();
}

Но, у тебя тут есть ярко выраженная пара init + cleanup — я бы предпочёл для этого класс-guard, или например ФВП.
Re: finalizer in C++
От: Mr.Delphist  
Дата: 15.06.15 11:56
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Нужен финалайзер и не хочется создавать еще одно энтити для этого.


Собственно, RAII и просится. Класс для контроля ресурсов, умный указатель как scope guard, автоматически срабатывающий деструктор — что ещё надобно?

Много простых сущностей — это не плохо. Плохо — когда есть один god object, эдакий Jack-all-trades.
Re: finalizer in C++
От: Abyx Россия  
Дата: 18.06.15 10:28
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Насколько уродливо такое решение?

для прототипа сойдет

G>
G>{
G>  in.SetEOFHandler(PartialPacketHandler);
G>  static int dummy = 0; // used to initialize std::unique_ptr but it will not be deleted
G>  auto deleter = [&in](int *p){in.SetEOFHandler(nullptr);};
G>  std::unique_ptr<int, decltype(deleter)> clean_up(&dummy, deleter);
G>  DoSomething(); // throws
G>}
G>


G>Может есть лучше способ?


"dummy" не нужен, т.к. есть "in"
auto deleter = [](auto in){ in->SetEOFHandler(nullptr); };
std::unique_ptr<decltype(in), decltype(deleter)> clean_up(&in, deleter);


но все же лучше использовать отдельный класс или хотя бы функцию,
чтобы делать еще и SetEOFHandler(PartialPacketHandler):
auto set_handler(Stream& s, Handler h) {
  s.SetEOFHandler(h);
  auto deleter = [](Stream* s){ s->SetEOFHandler(nullptr); };
  return std::unique_ptr<Stream, decltype(deleter)>(&s, deleter);
}

...

auto handler_guard = set_handler(in, PartialPacketHandler);


тогда будет соблюдаться SRP и DRY — код отвечающий за одну вещь будет в одном месте.
In Zen We Trust
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.