
AMDG Hans Larsen <hans <at> poltras.com> writes:
Hey guys. Very interesting this problem is and the proposed solutions leads one to another :)
Problem underlined below.
How do you know that it is args_line1? You cannot use __LINE__, since it is == 5.
Yeah. Wasn't thinking. Here's a solution that ought to work struct scope_exit_helper { virtual ~scope_exit_helper() {} }; struct scope_exit_helper_test : scope_exit_helper { void *dummy; }; int* i = new int; struct scope_exit_helper1_line1_t {int*& i; } scope_exit_helper1_line1 = { i }; struct scope_exit_helper2_line1_t { ~scope_exit_helper2_line1_t() { helper->~scope_exit_helper(); } scope_exit_helper* helper; boost::aligned_storage<sizeof(scope_exit_helper_test)> storage; } scope_exit_helper2_line1; { scope_exit_helper1_line1_t* in = &scope_exit_helper1_line1; scope_exit_helper2_line1_t* out = &scope_exit_helper2_line1; struct scope_exit_t : scope_exit_helper { scope_exit_t(scope_exit_helper1_line1_t* p) : impl(p) {} scope_exit_helper1_line1_t* impl; ~scope_exit_t() { run(impl->i); } void run(int*& i) { delete i; std::cout << "block exited" << std::endl; } }* scope_exit = static_cast<scope_exit_t*>( static_cast<void*>(out->storage.address())); out->helper = scope_exit; new(scope_exit) scope_exit_t(in); BOOST_STATIC_ASSERT((sizeof(scope_exit_t) == sizeof(scope_exit_helper_test))); } In Christ, Steven Watanabe