BOOST_SCOPE_EXIT와 내부 구조

우연히 회사에서 BOOST Study를 위한 준비 모임을 하게 되었습니다.

무엇을 Study 하면 좋을지에 대해서 논의하는 중이었는데, 우연히 BOOST_SCOPE_EXIT 라는

걸 발견하게 되었습니다.(전 Boost에는 문외한입니다.)

이걸 보는 순간 우와~~~ 라는 생각이 들더군요.

먼저 Example 부터 보고 시작하도록 하겠습니다.

void World::addPerson(Person const& aPerson) {
bool commit = false;
m_persons.push_back(aPerson);  // (1) direct action
BOOST_SCOPE_EXIT( (&commit)(&m_persons) )
{
if(!commit)
m_persons.pop_back(); // (2) rollback action
} BOOST_SCOPE_EXIT_END

// ...                        // (3) other operations

commit = true;                // (4) turn all rollback actions into no-op
}

BOOST_SCOPE_EXIT를 적용해서 가장 좋아지는 점은, 예전에 Return 하기전에

해야할 수많은 에러 처리등을 한군데서 처리 할 수 있다는 것입니다.  그렇다면 이는 어떻게 구현한 것일까요?

boost/scope_exit.hpp 소스를 보면 내부 구현이 inner struct를 선언해서 우이의 {, } 안의 부분이

내부 함수로 선언되게 되어있습니다.  이것만 말해도 먼가 눈치채시는 분들이 있으실 텐데, 즉, scope

를 벗어나면 Local Value 는 소멸되게 되고 이때, 소멸자가 불리면서 해당 코드가 실행되는 그런 구조가

되어버리는 것입니다. 즉, 위의 BOOST_SCOPE_EXIT 는 말 그래도 Scope를 벗어날 때, finally 키워드 처럼

실행되게 되는 겁니다.

Advertisements