Wielu ludzi jest bez wątpienia zna Pan Alexandrescus ScopeGuard szablonu (obecnie część Loki) oraz nową wersję ScopeGuard11 przedstawiony tutaj: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-CDlaczego program Alexandrescu nie może użyć std :: uncaught_exception() do zaimplementowania SCOPE_FAIL w ScopeGuard11?
ze źródłem tutaj: https://gist.github.com/KindDragon/4650442
W rozmowie w C++ i poza 2012 r. wspomniał, że nie może znaleźć sposobu na prawidłowe wykrycie, czy zakres został opuszczony z powodu wyjątku. Dlatego nie mógł zaimplementować makra SCOPE_FAIL, które wykonałoby dostarczoną lambdę (zwykle używaną do wycofania kodu) wtedy i tylko wtedy, gdy zakres został wyłączony z powodu wyjątku. Spowoduje to uczynienie funkcji członkowca dismiss() niepotrzebną i sprawi, że kod stanie się bardziej czytelny.
Ponieważ jestem w żaden sposób jako geniusza lub doświadczył jako Mr. Alexandrescu Spodziewam realizacji SCOPE_FAIL nie jest tak łatwe, jak to:
~ScopeGuard11(){ //destructor
if(std::uncaught_exception()){ //if we are exiting because of an exception
f_(); //execute the functor
}
//otherwise do nothing
}
Moje pytanie brzmi, dlaczego nie?
To dziwne, coś mi mówi, że to powinno działać, ale jeśli spróbuję, 'uncaught_exception()' zawsze zwraca 'false'. –
Niejasno pamiętam, że Herb Sutter miał coś takiego w GotW drodze powrotnej, ale nie mogę jej już znaleźć. Może Alzheimer;) lub nie robię niczego dobrego. – odinthenerd
Myślę, że w przypadku straży granicznej można w rzeczywistości użyć 'std :: uncaught_exception', ponieważ osłona oscyloskopu nigdy nie będzie członkiem innej klasy (az pewnością nie jest zmienną lokalną w klasie 'destructor). – Xeo