Здравствуйте, greenpci, Вы писали:
G>Может есть лучше способ?
почитайте здесь:
http://rsdn.ru/forum/cpp/5991672.flat.1Автор: Evgeny.Panasyuk
Дата: 23.03.15
Здравствуйте, 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, или например ФВП.
Нужен финалайзер и не хочется создавать еще одно энтити для этого.
Надо вызать это перед выходом из блока.
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
}
Может есть лучше способ?
Здравствуйте, 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 — код отвечающий за одну вещь будет в одном месте.