Информация об изменениях

Сообщение Re[5]: Не очень понимаю, как на модных плюсиках сделать таку от 22.09.2023 12:06

Изменено 22.09.2023 12:13 rg45

Re[5]: Не очень понимаю, как на модных плюсиках сделать таку
Здравствуйте, Sm0ke, Вы писали:

S>Можно ли как-то обойтись без std::function() ?


Можно, конечно. в С++14 и раньше — это достигается ценой добавления дополнительной функции:

http://coliru.stacked-crooked.com/a/e918d16f33d820de

template <typename Guard>
struct AtExit
{
    Guard guard;
    ~AtExit() { guard(); }
};

template <typename Guard>
AtExit<Guard> MakeGuard(Guard&& guard) { return {std::forward<Guard>(guard)}; }

// . . .
      const auto callTail = MakeGuard ([&]
      {
// . . .


Начиная с С++17, можно и без этой дополнительной фунции — просто класс AtExit делается шаблонным и дальше его можно будет использовать без явной спецификации шаблонного параметра, благодаря CTAD.
Re[5]: Не очень понимаю, как на модных плюсиках сделать таку
Здравствуйте, Sm0ke, Вы писали:

S>Можно ли как-то обойтись без std::function() ?


Можно, конечно. в С++14 и раньше — это достигается ценой добавления дополнительной функции:

http://coliru.stacked-crooked.com/a/e918d16f33d820de

template <typename Guard>
struct AtExit
{
    Guard guard;
    ~AtExit() { guard(); }
};

template <typename Guard>
AtExit<Guard> MakeGuard(Guard&& guard) { return {std::forward<Guard>(guard)}; }

// . . .
      const auto callTail = MakeGuard ([&]
      {
// . . .


Начиная с С++17, можно и без этой дополнительной фунции — просто класс AtExit делается шаблонным и дальше его можно будет использовать без явной спецификации шаблонного параметра, благодаря CTAD:

http://coliru.stacked-crooked.com/a/9d6ba61b6f3e46cb

template <typename Guard>
struct AtExit
{
    Guard guard;
    ~AtExit() { guard(); }
};
template <typename T>
AtExit(T&&) -> AtExit<T>;

// . . .
      const AtExit callTail = {[&]
      {
// . . .