2010-08-12 7 views
17

방금 ​​Scope Guard C++ 관용구에 대해 배웠습니다. 불행히도 나는 그것의 좋은 구현을 찾을 수 없습니다.어디에서 C++ 프로젝트를위한 훌륭한 Scope Guard 구현을 찾을 수 있습니까?

누구나 C++에서 유용하고 유용한 Scope Guard 구현을 가르쳐 줄 수 있습니까?

감사합니다. Boda Cydo.

+0

전에 들어 본 적이없는 사람 - 내게 거짓말을 한 사람은 http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Scope_Guard를 참조하십시오. IMHO는 매우 유용하지는 않습니다. 그리고 구현하기도 쉽습니다 - 구현을 "찾을 필요가 없습니다. –

+0

@ Neeil : RAII와 관련된 관용구에서 기대하는 것과는 아주 다른 흥미로운 점이 흥미 롭습니다. 성공적인 실행 후 누가 리소스를 처리하는지 궁금합니다. –

+0

@Matthieu Me. 스크루업에 대한 추가 가능성을 제외하고는 스마트 포인터에 비해 무엇이 있는지 알 수 없습니다. –

답변

8

ScopeGuard는 Andrei Alexandrescu의 Modern C++ Design 광고에 포함 된 Loki 라이브러리에 포함되어 있으며 프로덕션 코드에서 사용할 수있을만큼 충분히 성숙했습니다.

그냥 명확해야 : 우리는 RAII를 사용하여 예외 안전 코드를 작성하는 것에 대해 이야기합니다. (에 StackOverflow에)

추가 독서 과제 : 는 Does ScopeGuard use really lead to better code?

+0

예, Modern C++ Design에 대해 들어 봤습니다. 그러나 이해하기가 매우 어렵 기 때문에이 책을 읽지 않았습니다! 나는 아마도 언젠가는 한 문장을 이해할 것입니다. :) – bodacydo

+0

@boda 실제로, 나는 그것이 꽤 분명하게 쓰여지는 것이라고 생각한다. 나는 문제가 그가 말하는 것을하기위한 동기를 항상 명백하게 밝히지는 않는다고 생각하지만, 당신이 그것을 알기를 기대한다고 생각합니다. –

+1

나는 현대 C++ 디자인을 처음에는 열심히 찾았다. 그러나 Haskell에 대한 튜토리얼을 읽고 템플릿에 대한 정보를 다시 읽은 후에 나는 그것을 잘 이해했으며 회고 적으로 그가 어떻게 다르게해야했는지 모른다. 그것으로 돌아와 계속, 그것은 정말 좋은 책이다. – odinthenerd

0

A "범위 가드"개체는 훨씬 광범위한 RAII 관용구의 한 인스턴스입니다.

그리고 그 중 하나의 구현은 없습니다. 이것은 C++ 프로그래머가 을 이해하는 것입니다. 복사/붙여 넣기가 아니라을 이해해야합니다. 다행히 구현하기도 쉽습니다.

어떤 종류의 리소스를 나타내는 클래스를 만듭니다. 클래스가 (생성자 중 하나에 의해) 인스턴스화되면, 자원을 획득하고 실패 할 경우 예외를 throw해야합니다. 클래스가 파기되면 리소스를 삭제하여 필요한 모든 정리 작업을 수행해야합니다.

그리고 ... 그게 전부입니다. 또한 복사 생성자와 대입 연산자 (자원을 복제하거나이 두 함수를 private으로 만들어 호출하지 않도록)를 처리해야합니다.

"좋은 구현"을 찾을 필요가 없습니다. 수십개의 구현을 직접 작성해야하기 때문입니다. 그들은 작성하기가 쉽지 않으며, 각각 다른 유형의 자원을 래핑하기 때문에 쉽게 재사용 할 수 없습니다.

+0

고마워, 제프, 나 자신을 쓰려고 노력할 것이다. 이봐, 이거 힘든 운동이 될거야. 나는 그런 복잡한 코드를 작성하는 것을 꿈꿔 본 적이 없다! – bodacydo

+9

좋은 Scope Guard 클래스의 장점은 수십 가지의 다양한 구현을 직접 작성하지 않고도 임의 코드를 쉽게 호출 할 수 있다는 것입니다. –

14

원본 ScopeGuard 클래스는 Andrei Alexandrescu 및 Petru Marginean이 this Dr. Dobb's article에 포함되어 있습니다. Joshua Lehrer가 약간 변경된 약간 개선 된 버전은 here입니다. (Lehrer의 버전은 내 프로젝트에서 사용하고있는 버전입니다.) Loki 라이브러리에도 포함되어 있습니다.

부스트는 ScopeGuard보다 더 강력한 ScopeExit 라이브러리를 가지고 있습니다 (ScopeGuard는 기존의 단일 기능 만 호출 할 수있는 반면 임의 코드를 실행할 수 있기 때문에).

편집 : 스코프 가드는 실제로 RAII의 특정 응용 프로그램입니다.

+0

이 답변이 작성된 이후로 C++ 11이 나왔습니다. 그리고 그 후 - 새로운 ScopeGuard가 이전보다 훨씬 좋았습니다. @MikeEllery의 [this one] (http://stackoverflow.com/a/30652029/1593077)에 찬성하여 답변 비추천 조치를 고려하십시오. – einpoklum

0

표준 라이브러리에 scope_guard를 추가 할 것을 제안합니다. here을 복사하여 붙여 넣을 수있는 샘플 구현을 포함하는 종이를 읽을 수 있습니다. 구현 방법은 9.1 절을 참조하십시오.