4. 직접 복사 생성자를 정의
- 템플릿 특수화를 한 후 원하는 타입의 복사 생성자를 직접 선언
- 원하는 모든 타입에 대한 복사 생성자를 작성할 수는 없다
5. 멤버 함수 템플릿으로 복사 생성자를 작성
- 멤버 함수 템플릿을 이용하면 어떤 클래스의 멤버 함수를 다양한
타입으로 찍어낼 수 있다
- 이렇게 만든 생성자를 일반화 복사 생성자 (generalized copy
constructor) 라고 한다
- Raw 포인터처럼 암시적 변환을 지원할 수 있도록 explicit 키워드
제거
6. 멤버 함수 템플릿으로 복사 생성자를 작성
- 모든 타입에 대해 복사 생성자가 만들어 질 수 있기 때문에 문제가
발생할 여지가 있다
7. 멤버 함수 템플릿으로 복사 생성자를 작성
- 타입 U*에서 타입 T*로 암시적 변환이 가능할 때만 컴파일이
되도록 작동한다
8. shared_ptr 의 멤버 함수 템플릿
호환되는 모든 기본 제공 포인터 생성자
shared_ptr, weak_ptr 에 대응하는 생성자
shared_ptr 을 통한 암시적 변환만 허용하고 있다
9. shared_ptr 의 멤버 함수 템플릿
- template <bool B, class T = void> struct enable_if
- template <class From, class To> struct is_convertible
- unique_ptr 대입 생성자
- unique_ptr 은 shared_ptr에 이동되기 때문에 const 키워드가
빠져있고 오른값으로 들어온다
11. 기본 복사 생성자, 일반화 복사 생성자
일반화 복사 생성자가 있어도 호출 되지 않는다
12. 기본 복사 생성자, 일반화 복사 생성자
일반화 복사 생성자가 있어도 기본 생성자는 생성됨을 알 수 있다
13. 이것만은 잊지 말자!
- 호환되는 모든 타입을 받아들이는 멤버 함수를 만들려면 멤버
함수 템플릿을 사용합시다
- 일반화된 복사 생성 연산과 일반화된 대입 연산을 위해 멤버
템플릿을 선언했다 하더라도, 보통의 복사 생성자와 복사 대입
연산자는 여전히 직접 선언해야 합니다