#include<memory>
#include<iostream>
#define MAKETYPE(T) struct T { T() { std::cerr << #T ".ctor" << std::endl; } ~T() { std::cerr << #T ".dtor" << std::endl; } }
MAKETYPE(TypeA);
MAKETYPE(TypeB);
MAKETYPE(TypeC);
MAKETYPE(TypeD);
int main()
{
std::shared_ptr<TypeA> a(new TypeA);
{
bool error;
std::cerr << "Does doA fail? ";
std::cin >> error;
if (error)
goto out_a;
else
{
std::shared_ptr<TypeB> b(new TypeB);
TypeD d;
std::cerr << "Does doB fail? ";
std::cin >> error;
if (error)
goto out_b;
else
{
std::shared_ptr<TypeC> c(new TypeC);
std::cerr << "Does doABC fail? ";
std::cin >> error;
if (error)
goto out_c;
else
goto out;
}
}
}
out_c:
std::cerr << "Undid doABC" << std::endl;
out_b:
std::cerr << "Undid doB" << std::endl;
out_a:
std::cerr << "Undid doA" << std::endl;
out:
return 0;
}