본문 바로가기

컴퓨터/Modern Effective C++ 정리16

Modern Effective C++ item 27 : Universal Reference 오버로딩의 대안들 Universal Reference 오버로딩의 대안들item 26에서 universal reference를 오버로딩하는 것의 문제점에 대해서 이야기했다. 하지만 universal 오버로딩 방식의 장점도 분명하다. 이 장에서는 그런 상황에 처했을때, 어떻게 곁가지 문제들을 회피하면서 원하는 기능을 수행할 수 있는지를 이야기 할 것이다.오버로딩 금지item 26의 logAndAdd 예시를 생각해보자. universal reference의 강력한 포용력(?)때문에 다른 오버로딩들이 씹혀버리는 불상사가 발생하였다. 그렇다면 그냥 오버로딩을 포기하는게 속편할 수 있다. logAndAddName 과 logAndAddNameIdx 같은 느낌의 이름으로 바꾸면 일차적으로 해결은 된다. 그런데 생성자는 어떻게 이름을 바.. 2015. 5. 6.
Modern Effective C++ item 25 : std::move / std::forward 를 적재적소에 사용하자. std::move / std::forward 를 적재적소에 사용하자.item 23,24에서 이야기한 것처럼, std::move는 인자를 무조건적으로 rvalue reference로 캐스팅하고, std::forward는 인자가 rvalue인지 체크해서 조건부로 rvalue reference로 변경한다. 여기서 주의해야할 사항이 있다. universial Reference에는 std::move를 사용해선 안되고, rvalue reference에는 std::forward를 사용해선 안된다. 전자는 정말 위험하다.universial Reference에 std::move를 쓰지말자.class Widget{ public: template void setName(T&& newName) //T&&는 universial.. 2015. 4. 28.
Modern Effecitve C++ item 22 : Pimple Idiom Pimpl IdiomPimpl(Pointer to Implementation) Idiom이란 include가 필요한 유저 define 타입의 멤버변수들을 해당 멤버변수들을 포함한 구조체의 포인터로 대체하는 방법이다. 말로 쓰면 어려워 보이니 실제 C++ 98에서 자주 사용하던 예시를 들어서 설명하도록 하겠다.//in header Widget.h #include #include #include class Widget{ public: Widget(); ... private: std::string name; std::vector data; Gadget g1, g2, g3; }Pimpl Idiom을 사용하지 않는다면, 자주 보는 형태의 헤더파일일 것이다. 이런 형식의 헤더파일의 문제점은 헤더파일 내에서 다른 헤.. 2015. 4. 21.
Modern Effective C++ item 20 : 댕글링 포인터엔 weak_ptr 댕글링 체크엔 std::weak_ptrweak_ptr은 shared_ptr과는 달리 참조 횟수에 영향을 받지 않는 스마트 포인터이다. shared_ptr에서 고민했던 내용들을 생각해보자. 어떤 포인터가 주소를 가져오는데, 참조 횟수에 영향을 미치지 않는다면, 공유 자원의 일관성을 유지하기 위해서 실제 포인터가 할 수 있는 기능들을 대부분 포기해야할 것이다. 실제로 이 포인터는 역참조가 안되고, nullptr체크도 안된다. 게다가 참조 카운터를 고려안하므로 댕글링상태에 빠지기도 쉬울 것이다.(후후..) 스스로는 뭔가 제대로된 역할을 하기 힘든 포인터이다. 이런걸 smart하다고 말하기 어려울 수 있지만, shared_ptr과 함께 쓰일때 그 진정한 스마트함을을 갖출 수 있다. 결론부터 말하자면 이 포인터는.. 2015. 4. 14.