C++ Template Note 부록 비슷한 패턴의 루프 C++11 Lambda(람다) <작성 필요> _countof 겹자 digraph Function types , Function pointers TR1 std::function & std::bind <작성 필요> tuple 0. 이 문서는... 01. 들어가며 02. 함수 템플릿 1 함수 템플릿 정의 2 인자추론 3 오버로딩 함수 템플릿 03. 클래스 템플릿 1 Stack 의 구현 2 Stack 클래스의 사용 3 특수화 4 부분 특수화 5 기본 템플릿 인자 04. 데이터형이 아닌 템플릿 매개변수 05. 고급기능 01 typeid 연산자 02 키워드 typedef 1 typedef 03 키워드 typename 1 typename 사용해보기 04 키워드 template 05 this-> 사용 06 멤버 템플릿 1 템플릿 복사 생성자와 템플릿 복사 할당 연산자 07 템플릿 템플릿 파라미터 08 기본형의 0 초기화 09 함수 템플릿에 문자열 리터럴을 인자로 사용 10 암시적 인터페이스와 컴파일타임 다형성 11 템플릿 파라미터 제약하기 1 12 템플릿 파라미터 제약하기 2 1 특성(traits) 클래스 2 상속여부를 확인하는 헬퍼클래스 06. 템플릿 실제 사용 1 포함 모델 2 명시적 인스턴스화 1 포함모델, 명시적 인스턴스화 예제 3 분리 모델 1 export의 한계 1부 : 기초 2 export의 한계 2부 : 상호작용, 유용성문제, 지침들 4 템플릿과 inline 5 Precompiled Header <작성 필요> 6 템플릿 디버깅 1 오류 소설을 디버깅하기 2 도구를 이용한 진단 분석 <작성 필요> 3 의도적인 진단 생성 <작성 필요> 07. 기본 템플릿 용어 1 클래스 템플릿과 템플릿 클래스 2 인스턴스화와 특수화 3 선언과 정의 4 단정의 법칙 5 템플릿 인자와 템플릿 파라미터 <작성 필요> 08. 템플릿 기초 원리의 깊은 이해 1 파라미터화된 선언 2 템플릿 파라미터 3 템플릿 인자 4 프렌드 1 템플릿 친구 만들기 09. 템플릿에서의 이름 1 이름 분류학 2 이름 룩업 01 이름 검색과 인터페이스 Part1 02 이름 검색과 인터페이스 Part2 03 이름 검색과 인터페이스 Part3 04 이름 검색과 인터페이스 Part4 05 네임스페이스 Part 1 : using 선언과 using 지시자 06 네임스페이스 Part 2 : 네임스페이스로 마이그레이션(migration) 07 유효범위 및 이름은폐 08 상속받은 비가상 함수를 재정의 하지말자 09 템플릿 기본클래스의 이름 접근하기 10 private은 얼마나 비공개적인가? 3 템플릿 파싱 4 파생과 클래스 템플릿 -1. 의견 교환 10. 템플릿 인스턴스화 11. 템플릿 인자 추론 1 추론과정 2 추론된 문맥 3 특별 추론 상황 4 허용되는 인자 변환 5 클래스 템플릿 파라미터 6 기본 호출 인자 7 바튼-넥만 트릭 12. 특수화와 오버로딩 1 "일반적인 코드"가 좋지 않을 때 2 함수 템플릿 오버로딩 함수 템플릿을 특수화하지 말아야 하는 이유 3 명시적 특수화(Explicit Specialization) 4 부분 클래스 템플릿 특수화 13. 템플릿의 다형성 능력 1 동적 다형성 2 정적 다형성 3 동적 다형성과 정적 다형성 비교 4 설계 패턴의 새로운 형태 5 일반화 프로그래밍(Generic Programming) 14. 특질(Trait)과 정책(Policy) 클래스 1 예제 : 수열 더하기 2 데이터형 함수 3 정책 특질 15. 템플릿과 상속 1 이름 붙여진 템플릿 인자 2 빈 기본 클래스 최적화 3 묘하게 되풀이되는 템플릿 패턴(CRTP) 4 파라미터화된 가상성 16. 메타프로그래밍 17. 표현식 템플릿 1 단순 배열 클래스 구현 및 문제 제기 2 표현식 템플릿 클래스 구현 3 표현식 템플릿을 알고 있는 랩퍼클래스 및 연산 구현 4 실재 값으로 연산과정 추적 1 표현식 템플릿의 할당 5 표현식 템플릿의 성능과 한계 18. 데이터형 분류 Type Classification 1 기초형 결정 2 복합형 결정 3 함수형 식별 4 오버로딩 해석으로 열거형 분류 5 클래스형 결정 6 TypeT 구현 정리 19. 스마트 포인터 1 소유자Holder와 전달 캡슐Trule 1 소유자 Holder 2 멤버로서의 Holder 3 자원 획득은 초기화다 4 Holder 한계 5 Holder 복사 6 전달 캡슐 Trule 2 참조 카운트 Reference Counting 1 카운터 위치 2 동시(Concurrent) 카운터 접근 3 소멸(Destruction)과 할당 해제(Deallocation) 4 CountingPtr 템플릿 5 간단한 비침습성(Noninvasive) 카운터 6 간단한 침습성(intrusive) 카운터 7 상수성(Constness) 8 묵시적 변환(Implicit Conversions) 9 비교(Comparisons) 3 스마트 포인터의 가벼운 고찰 - 자원 관리 객체 포함하는 1 스마트 포인터의 생성, 대입, 소멸 2 역참조(Dereferencing) 연산자 구현하기 3 NULL 점검과 일반 포인터 변환 4 스마트 포인터와 상속 기반의 타입변환 5 스마트 포인터와 const 6 참조 카운팅 1 참조 카운팅 구현 2 기록시점 복사 Copy-on-Write 3 포인터, 참조자, 기록 시점 복사 4 참조 카운팅 기본 클래스 5 참조카운팅 조작 자동화 6 참조 카운팅 구현 정리 7 기존 클래스 참조 카운팅 추가 8 총정리 4 스마트 포인터의 깊은 고찰 - 정책클래스를 통해 01 스마트 포인터 첫걸음 02 대가 03 스마트 포인터의 저장 구조 - Storage 정책 04 스마트 포인터 멤버 함수 - Storage 정책 05 소유권 관리 정책 - OwnerShip 정책 1 완전 복사(Deep Copy) 2 Copy on Write(COW) 3 참조 카운팅 Reference Counting 4 참조 연결 리스트 5 파괴 복사(destructive copy) 06 주소 추출 연산자 07 원시 포인터 자료형의 암묵적 형변환 - Conversion 정책 08 동치와 부등 조건 09 대소 비교 10 오류 검사 및 보고 - Checking 정책 11 상수 객체에 대한 스마트 포인터와 상수 스마트 포인터 - Constness 정책 12 배열 - Storage 정책 13 스마트 포인터의 다중 스레딩 1 포인팅 받는 객체 레벨에서의 다중 스레딩 2 부가 데이터 수준에서의 다중 스레딩 14 통합 정리 1 Storage 정책 2 Ownership 정책 3 Conversion 정책 4 Checking 정책 5 Constness 정책 6 SmartPtr 전문 15 StrongPtr 1 Delete 정책 2 Reset 정책 3 Ownership 정책 4 StrongPtr 전문 5 auto_ptr 1 auto_ptr을 안전하고 효율적으로 사용하는 방법 2 auto_ptr을 배열과 사용? 3 auto_ptr를 멤버로 사용하기 4 auto_ptr대신 복사를 허용하는 스마트포인터 5 auto_ptr과 STL 컨테이너 6 auto_ptr의 전반적인 내용 7 auto_ptr은 C++11에서 폐기 예정!! 6 shared_ptr 7 unique_ptr 8 boost 스마트 포인터 -2. 업데이트 히스토리 20. 튜플 1. Duo 2 재귀적 듀오 1 필드의 수 2 필드의 데이터 형 3 필드의 값 3. tuple 21. 함수 객체와 콜백 22. C++11 00 중요 세부 문법 정리 01 nullptr과 std::nullptr_t 02 auto로 자동 데이터형 추론 10 변경사항 11 변경사항 12 변경사항 추가 13 변경사항 2 enum Class 3 enum Forward-Declaring 6 변경사항 7 변경사항 8 변경사항 9 변경사항 23. Boost asio basic work with protobuf ( or boost.serialization ) A. 템플릿을 제외한 기본 C++ 이야기 A.00. 시작 전 몸풀기 B. 예외 C++14
    Published with WikiDocs
    1. C++ Template Note
    2. 19. 스마트 포인터
    3. 3 스마트 포인터의 가벼운 고찰 - 자원 관…
    4. 2 역참조(Dereferencing) 연산자…
    1. 도서 증정 이벤트 !!
    2. 위키독스

    2 역참조(Dereferencing) 연산자 구현하기

    More Effective C++ / Scott Meyers 저, 곽용재 역 / 정보문화사
    항목 28 : 스마트포인터

    기반으로 정리하려 합니다

    스마트 포인터의 심장부라고 말할 수 있는 operator와 operator->함수 입니다. operator 부터 알아보겠습니다 일반적으로 스마트포인터의 operator*는 이렇게 구현합니다

    template<class T>
    T& SmartPtr<T>::operator*() const
    {
      "스마트포인터" 처리를 수행합니다;
      return *pointee;
    }
    

    이함수는 pointee를 초기화하든지 pointee를 유효하게 하는 일을 닥치는 대로 합니다. 이를테면, 지연 방식의 가져오기가 사용되는 상태에서는 pointee가 가리키는 객체를 불러와야 하겠습니다. 어쨌든 일단 pointee가 유효하다고 판정되면 operator* 함수는 스마트 포인터가 가리키는 객체의 참조자를 반환합니다

    여기서 이 함수의 반환 타입이 참조자(reference) 라는 점에 주목할 필요가 있습니다 T에서 파생된 클래스의 객체를 가리켜도 문제가 없다는 것이죠 만일 이런 경우에 operator* 함수가 실제로 파생된 클래스 객체의 참조자가 아닌 T객체를 (값으로) 반환해 버리면 T 파생 객체의 데이터를 없어지고 T 객체로 반환이 됩니다(슬라이스 문제)

    operator-> 동작도 operator*의 동작과 별반 다르지 않습니다 그런데 operator->에 대한 이야기를 하기전에 이 함수의 호출에 관련된 이상한 의미를 함께 고민해 볼 필요가 있습니다

    void editTuple(DBPtr<Tuple>& pt)
    {
       LogEntry<Tuple> entry(*pt);
       do {
          ps->displayEditDialog();
       } while ( ps->isValid() == false );
    }
    

    이 함수는 보다시피 Tuple에 대한 스마트 포인터 객체를 사용하는 함수입니다 ps->displayEditDialog(); 이문장은 컴파일러에 의해 다음과 같이 됩니다 (ps.operator->())->displayEditDialog(); operator->가 반환하는 것이 무엇이든 간에 멤버 지정 연산자(->)를 그것에 대해 적용해도 상관 없어야 한다는 뜻을 담고 있습니다 operator->가 반환할 수 있는 것은 오로지 원시 포인터 아니면 스마트 포인터 객체 중 하나입니다. 일반적인 operator-> 다음과 같이 구현합니다

    
    template<class T>
    T* SmartPtr<T>::operator->() const
    {
       "스마트 포인터" 처리를 합니다
       return pointee;
    }
    
    

    이함수는 포인터를 반환하기 때문에 operator->를 통해 호출되는 가상함수가 동적 타입에 잘 맞추어 의도대로 동작합니다 선-후 함수 호출(pre-and post function calls) 이라고 스마트 포인터의 깊은 고찰 편에서 살펴보도록 합시다

    마지막 편집일시 : 2013년 11월 14일 9:48 오전
    댓글 0 피드백
    ※ 댓글 작성은 로그인이 필요합니다. (또는 피드백을 이용해 주세요.)
    • 이전글 : 1 스마트 포인터의 생성, 대입, 소멸
    • 다음글 : 3 NULL 점검과 일반 포인터 변환
    TOP

    이 페이지에 대한 피드백을 남겨주세요

    ※ 피드백은 저자에게 e-메일로 전달됩니다.

    댓글을 신고합니다.

    해당 댓글을 신고하시겠습니까? 댓글 신고는 다음과 같은 경우에 사용해주세요:
    1. 스팸 또는 광고성 내용이 포함된 경우
    2. 욕설, 비방, 개인정보 유출 등 부적절한 내용이 포함된 경우
    3. 저작권을 침해하는 내용이 포함된 경우

    ※ 신고하신 내용은 관리자에게 전달되며, 확인 후 적절한 조치가 이루어집니다. 신고는 익명으로 처리되며, 신고자의 정보는 공개되지 않습니다.