Jest to swego rodzaju kontynuacją na Why can't Alexandrescu use std::uncaught_exception() to implement SCOPE_FAIL in ScopeGuard11?Czy istnieje jakaś sztuczka do wykrywania, czy obiekt jest tworzony podczas wykonywania innego destruktora?
chciałbym wykryć, czy ktoś jest tworzenie MyClass
w destruktora innej klasy (lub z aktywnym destructor gdzieś na stos wywołań).
class MyClass
{
public:
MyClass(){
assert(???what to put here????);
}
}
void f(){
MyClass m; //whether this asserts should be context dependant
}
class OtherClass{
~OtherClass(){
MyClass m; //this should assert
f(); //this should too;
}
}
int main()
{
MyClass m; //this should not assert
f(); //this should also not assert
}
Jedna próba może być:
assert(!std::uncaught_exception());
ale to będzie działać tylko wtedy, gdy destruktor jest wywoływany z powodu wyjątku, jeśli nie jest ona wywoływana, ponieważ obiekt wyszedł z zakresu.
Jeśli nie zaprojektujesz tych destruktorów w sposób jawny, aby sygnalizować ich wykonanie, wątpię, aby było to możliwe. Zasadniczo nie możesz określić, skąd twoja funkcja została wywołana. –
Jak przenośne ma być rozwiązanie? – Flexo
Możesz specjalizować swoje rozwiązanie do konkretnej wersji kompilatora i zbadać stos w konstruktorze 'MyClass', aby znaleźć destruktor' OtherClass'. Osobiście uważam, że jest to zbyt dużo pracy dla tego, czym jest ... i będzie źródłem błędów. – Synxis