Solución genérica con función RAII y boost :: (std :: function).
class starter
{
typedef boost::function< void() > action;
action end_;
public:
starter(action start, action end):
end_(end)
{
log("starter start");
start();
}
~starter()
{
log("starter end");
end_() ;
}
};
int main()
{
{
starter s(start, stop);
middle();
}
return 0;
}
o para probar y comprobar la idea
void print(const std::string& message)
{
std::cout << message << std::endl;
}
int main()
{
starter s(boost::bind(print, "globalstart"),
boost::bind(print, "globalend"));
{
starter s(boost::bind(print, "start"),
boost::bind(print, "end"));
std::cout << "middle" << std::endl;
}
return 0;
}
+1. Este enfoque es sólido como una roca. Incluso si se lanza una excepción, se seguirá llamando a stop(), ya que C++ garantiza que los destructores siempre son llamados en la salida del alcance. –
También evita problemas difíciles de solucionar que pueden ocurrir con las macros. –
+1. La conversación en la respuesta de dirkgently es intrigante, pero esta es la mejor solución porque no crea un "macro lenguaje secreto". –