Notice
Recent Posts
Recent Comments
Link
- 책_곽용재님 홈페이지
- 책_노란북 - 책 가격비교
- 책_김재우-SICP번역
- 플밍_쏘쓰포지
- 플밍_CodingHorror ?
- 플밍_상킴
- 플밍_김민장님
- GPGStudy
- 플밍_미친감자님
- 플밍_jz
- 플밍_샤방샤방님
- 플밍_글쓰는프로그래머2
- 플밍_키보드후킹
- 사람_재혁
- 사람_kernel0
- 사람_박PD
- 사람_경석형
- 사람_nemo
- 사람_kikiwaka
- 사람_Junios
- 사람_harry
- 사람_어떤 개발자의 금서목록..
- 사람_모기소리
- 사람_낙타한마리
- 사람_redkuma
- 사람_영원의끝
- 사람_민식형
- 도스박스 다음카페
- 플레이웨어즈 - 게임하드웨어벤치마크
- http://puwazaza.com/
- David harvey의 Reading Marx's c…
- 씨네21
- 한겨레_임경선의 이기적인 상담실
- 본격2차대전만화 - 굽시니스트
- 영화_정성일 글모음 페이지
- 영화_영화속이데올로기파악하기
- 음식_생선회
- 죽력고
- 사람_한밀
- 플밍_수까락
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- stl
- 정신분석
- 삼국지6
- modernc++
- 소비자고발
- 태그가 아깝다
- 삼국지
- template
- 건강
- 진중권
- 고전강의
- 정성일
- 노무현
- 프로그래밍
- BSP
- 유머
- 진삼국무쌍5
- 일리아스
- 김두식
- 인문학
- 책
- programming challenges
- 단상
- 고등학교 사회공부
- c++
- 게임
- 영화
- 유시민
- Programming
- 강유원
Archives
- Today
- Total
01-07 02:28
lancelot.com
coercion by member template 본문
- Dog 포인터가 Animal의 포인터에 대입가능하면, smartptr<Dog> 의 포인터도 smartptr<Animal> 의 포인터에 대입가능해야한다.
- template 생성자 필요
- template class smartptr 을 friend 로 선언 필요 (생성자에서 private member에 접근해야하므로)
class Animal {};
class Dog : public Animal {};
template<typename T>
class smartptr
{
T* ptr = nullptr;
public :
smartptr() = default;
smartptr(T* p) : ptr(p) {}
// smartptr(const smartptr<T>& sp) {} // 같은 타입만 받을 수 있다.
// smartptr(const smartptr<Dog>& sp) {} // smartptr<Dog>만 받을 수있다.
// template 생성자
template<typename U>
smartptr(const smartptr<U>& sp) : ptr(sp.ptr) { }
template<typename U> friend class smartptr;
};
int main()
{
Dog* p1= new Dog;
Animal* p2 = p1;
smartptr<Dog> sp1(new Dog);
smartptr<Animal> sp2 = sp1;
}
- enable_if 를 사용하면, 오류상황에서 조금 더 명확하게 메세지를 전달할 수 있다.
#include<type_traits>
class Animal {};
class Dog : public Animal {};
template<typename T>
class smartptr
{
T* ptr = nullptr;
public :
smartptr() = default;
smartptr(T* p) : ptr(p) {}
// smartptr(const smartptr<T>& sp) {} // 같은 타입만 받을 수 있다.
// smartptr(const smartptr<Dog>& sp) {} // smartptr<Dog>만 받을 수있다.
// template 생성자
template<typename U, typename=std::enable_if_t<std::is_convertible_v<U*, T*>> > // 포인터 타입이 변환 가능한지를 체크
smartptr(const smartptr<U>& sp) : ptr(sp.ptr) { }
template<typename U> friend class smartptr;
};
int main()
{
Dog* p1= new Dog;
Animal* p2 = p1;
smartptr<Dog> sp1(new Dog);
smartptr<Animal> sp2 = sp1;
smartptr<int> sp3(new int);
smartptr<double> sp4 = sp3; // enable_if 를 사용해서, error 메세지를 좀 더 명확하게 함
}