Ich habe eine kleine Utility-Klasse für C++ 11 geschrieben, die ich als Scope-Guard für eine einfachere Handhabung der Ausnahmesicherheit und ähnlicher Dinge verwende.C++ 11 Scope Exit Guard, eine gute Idee?
Scheint etwas wie ein Hack. Aber ich bin überrascht, dass ich es nirgendwo anders mit C++ 11 Funktionen gesehen habe. Ich denke Boost hat etwas ähnliches für C++ 98.
Aber ist es eine gute Idee? Oder gibt es potenzielle Probleme, die ich verpasst habe? Gibt es bereits eine ähnliche Lösung (mit C++ 11-Funktionen) in Boost oder ähnlich?
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)
und es ist so etwas wie verwendet.
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;
}
Fest destructor – ronag
siehe http://pizer.wordpress.com/2008/11/22/scope-guards-revisited-c0x- style/ – sellibitze
Vielleicht möchten Sie sich meine Lazy-RAII-Klassen ansehen: http://stackoverflow.com/questions/2419650/cc-macro-template-blackmagic-to-generate-unique-name/2419715#2419715. Beachten Sie, dass Ihr 'scope_exit' auf die Beseitigung von Kopierkonstruktoren angewiesen ist. Wenn Sie dieses Snippet ohne diese Optimierung kompilieren, rufen Sie den Scope-Exit Lambda zweimal auf. Sehen Sie sich meine RAII-Klassen an, um dieses Problem zu umgehen. –