Защита от выхода из области видимости C ++ 11, хорошая идея?

Я написал небольшой служебный класс для C ++ 11, который я использую в качестве защиты области видимости для более простой обработки безопасности исключений и подобных вещей.

Похоже на взлом. Но я удивлен, что не видел его где-либо еще с использованием функций C ++ 11. Я думаю, что у boost есть что-то подобное для C ++ 98.

Но хорошая ли это идея? Или есть потенциальные проблемы, которые я упустил? Есть ли уже похожее решение (с функциями C ++ 11) в boost или подобное?

    namespace detail 
    {
        template<typename T>
        class scope_exit : boost::noncopyable
        {
        public:         
            explicit scope_exit(T&& exitScope) : exitScope_(std::forward<T>(exitScope)){}
            ~scope_exit(){try{exitScope_();}catch(...){}}
        private:
            T exitScope_;
        };          

        template <typename T>
        scope_exit<T> create_scope_exit(T&& exitScope)
        {
            return scope_exit<T>(std::forward<T>(exitScope));
        }
    }


#define _UTILITY_EXIT_SCOPE_LINENAME_CAT(name, line) name##line
#define _UTILITY_EXIT_SCOPE_LINENAME(name, line) _UTILITY_EXIT_SCOPE_LINENAME_CAT(name, line)
#define UTILITY_SCOPE_EXIT(f) const auto& _UTILITY_EXIT_SCOPE_LINENAME(EXIT, __LINE__) = ::detail::create_scope_exit(f)

, и оно использовалось что-то вроде.

int main () 
{
  ofstream myfile;
  myfile.open ("example.txt");
  UTILITY_SCOPE_EXIT([&]{myfile.close();}); // Make sure to close file even in case of exception
  myfile << "Writing this to a file.\n"; // Imagine this could throw
  return 0;
}
24
задан Xeo 19 December 2011 в 00:25
поделиться