привет
подумал (возможно ошибочно) удобно было бы совместить loki_on_block_exit и boost_scope_exit
как вам? (работает под MSVC)
возможный юзкейс
юзаем как в loki
HDESK hDesk = CreateDesktop(desktopName , NULL, NULL, 0, DESKTOP_SWITCHDESKTOP|
DESKTOP_WRITEOBJECTS|
DESKTOP_READOBJECTS|
DESKTOP_ENUMERATE|
DESKTOP_CREATEWINDOW|
DESKTOP_CREATEMENU, NULL);
scope_exit(CloseDesktop(hDesk));
юзаем как в boost_scope_exit
if (CreateProcess(NULL, (LPSTR)"***.exe args", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &procInfo)) {
scope_exit() {
CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);
};
вот реализация
#ifndef X13_SCOPEGUARD_INC_
#define X13_SCOPEGUARD_INC_
#include <boost/preprocessor/cat.hpp>
namespace x13scopeguard
{
template<typename F>
class ScopeExit
{
public:
ScopeExit(const F& fn) : m_fn(fn) {;}
~ScopeExit()
{
m_fn();
}
private:
F m_fn;
};
class ScopeExitCreator
{
public:
template<typename Fn>
ScopeExit<Fn> operator << (const Fn &fn)
{
return ScopeExit<Fn>(fn);
}
};
}
#define SCOPE_EXIT_CAT(...) , ## __VA_ARGS__
#define SCOPE_EXIT_COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _
#define SCOPE_EXIT_REPEAT_PARAMS(...) (__VA_ARGS__)
#define SCOPE_EXIT_COUNT_PARMS(...) SCOPE_EXIT_COUNT_PARMS2 \
SCOPE_EXIT_REPEAT_PARAMS(SCOPE_EXIT_CAT(__VA_ARGS__) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define SCOPE_EXIT_LAMBDA2() const auto &BOOST_PP_CAT(scope_exit_guard_,__LINE__) = \
x13scopeguard::ScopeExitCreator() << [&]()
#define SCOPE_EXIT_LAMBDA(...) BOOST_PP_IF(SCOPE_EXIT_COUNT_PARMS(__VA_ARGS__), \
SCOPE_EXIT_LAMBDA2() { __VA_ARGS__; }, SCOPE_EXIT_LAMBDA2())
#define scope_exit(...) SCOPE_EXIT_LAMBDA(__VA_ARGS__)
#endif