scope_exit
От: jyuyjiyuijyu  
Дата: 12.12.15 05:04
Оценка: 2 (1)
привет

подумал (возможно ошибочно) удобно было бы совместить 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.