본문 바로가기

2017/123

[항목45]호환되는 모든 타입을 받아들이는 데는 멤버 함수 템플릿이 직방! 스마트 포인터에서 포인터와 같은 암시적 형 변환을 지원하게 해주기 위해 코드를 작성해보면 그 작업이 엄청 까다롭다는 것을 깨달을 수 있다.templateclass SmartPtr{public: explicit SmartPtr(T* realPtr);}; class Top{}; class Middle : public Top {}; class Bottom : public Middle{}; SmartPtr pt1 = SmartPtr(new Middle);SmartPtr pt1 = SmartPtr(new Bottom);포인터의 경우 암시적 변환이 가능하지만 SmartPtr과 SmartPtr은 컴파일러가 봤을 때 완전 별개의 클래스입니다. 따라서 직접 코드를 작성해줘야 합니다. templateclass SmartP.. 2017. 12. 28.
[항목44]매개변수에 독립적인 코드는 템플릿으로부터 분리시키자 템플릿을 사용하면 생김새나 하는 일이 비슷한 클래스의 코드를 일일이 작성해주지 않아도 된다.* 몰랐던 내용인데 클래스 템플릿의 멤버 함수는 실제로 사용될 때에만 암시적으로 인스턴스화 된다고 한다.(나는 클래스가 인스턴스화될 때 들고있는 모든 멤버함수들도 인스턴스화 되는 줄 알고 있었다...) 하지만 이 템플릿도 아무 생각 없이 사용하다가는 템플릿의 적 코드 비대화(code bloat)를 초래 할 수 있다.고정 크기의 정방행렬을 나타내는 클래스 템플릿으로 위 설명의 예를 보여드리겠습니다. templateclass SquareMatrix {public: void invert(); //주어진 행렬을 역행렬로 만드는 함수} 위으 SquareMatrix 템플릿 클래스는 T라는 타입 매개변수와 size_t라는 비타.. 2017. 12. 26.
[항목43]템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자 template class MsgSender{public: void sendClear(const MsgInfo& info) { 동작... }} templateclass LoggingMsgSender : public MsgSender{public: void sendClearMsg(const MsgInfo& info) { sendClear(info); }} 위의 코드는 컴파일되지 않는다.그 이유는 LoggingMsgSender 클래스가 컴파일될 때 Base클래스인 MsgSender의 템플릿 매개변수가 어떤 것인지 모르기 때문에(LoggingMsgSender가 인스턴스로 만들어 질 때까지 무엇인지 알 수 없다) MsgSender 클래스가 어떤 형태인지 알 수 없어서 sendClear 함수가 들어 있는지 없는지.. 2017. 12. 25.