Я написал небольшой служебный класс для C++11, который я использую в качестве защиты области действия для упрощения обработки безопасности исключений и подобных вещей.
Похоже на взлом. Но я удивлен, что не видел его где-то еще с использованием функций С++ 11. Я думаю, что у boost есть что-то подобное для C++98.
Но хорошая ли это идея? Или есть потенциальные проблемы, которые я пропустил? Есть ли уже подобное решение (с функциями С++ 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;
}
scope_exit
зависит от исключения конструктора копирования. Если вы скомпилируете этот фрагмент без этой оптимизации, вы дважды вызовете лямбда-выход из области видимости. Посмотрите мои занятия по RAII, чтобы узнать, как обойти эту проблему. - person Johannes Schaub - litb   schedule 30.09.2010