#include template void foo(T) { int* i = new int; struct args_line1_t {int*& i; } args_line1 = { i }; struct scope_exit_activator_line1_t { ~scope_exit_activator_line1_t() { this->function(this->argument); } void* argument; void (*function)(void*); } scope_exit_activator_line1 = { &args_line1 }; { scope_exit_activator_line1_t* activator = &scope_exit_activator_line1; struct scope_exit_body_wrapper { static void entry(void* raw_args) { args_line1_t* args = static_cast(raw_args); body(args->i); } static void body(int*& i) { delete i; std::cout << "block exited" << std::endl; } }; activator->function = &scope_exit_body_wrapper::entry; } } int main() { foo(0); }