5 ms·
Do they have a new version based on lambdas? The syntax of that is painful. I splatter my code with this: // WTFPL class Finally { std::function<void()
by nwallin 8y ago
Do they have a new version based on lambdas? The syntax of that is painful. I splatter my code with this:
// WTFPL
class Finally {
std::function<void()> f;
public:
Finally(std::function<void()> f) : f{f} {}
~Finally() {f();}
void disable() { f = [](){}; }
};
Which looks much prettier:
socket* s = open_socket(); // or whatever
Finally cleanup_socket{[](){ close_socket(s);}};
// optionally, to keep it alive:
cleanup_socket.disable();
Am typing on mobile. No guarantees about syntax errors. I still need to look into where the right places to put r value references and/or std::move are, but for the most part, I never put anything other than a pointer in the closure so I'm not worried about copy constructor cost.
- Matthias247 8y agoHowever your implementation based on std::function might allocate, which is then non-zero cost compared to normal exit statements. Better directly store the lambda inside the class, which requires that to be generic (Finally<LambdaType>). That can be hidden by using the class via a templated function which uses types interference: auto cleanup_socket = make_scope_guard([&]{ close_socket(s); }); Searching for scope_guard yields lots of alternative implementations.
- frankzinger 8y agomake_* functions are no longer necessary in C++17 which adds "Class template argument deduction" [1]. You can now do std::pair p{"aaa", 123}; and Finally guard{[]{cleanup();}}; without specifying template arguments. [1] https://en.cppreference.com/w/cpp/language/class_template_argument_deduction https://en.cppreference.com/w/cpp/language/class_template_ar...
- Matthias247 8y agoThx, I wasn't aware about this feature yet!