Здравствуйте, 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 = {[&]
{
// . . .