이번 항목은 제네릭 프로그래밍에 있어, 템플릿의 사용은 이렇게 해 주어야 한다 는 것을 말하는 항목이다.바로 질문 넘어가서, 파악해 보도록 하자. 질문 1. "C++ 템플릿은 컴파일 시점 다형성을 제공한다"라는 문장을 설명하라. .. 런타임 다형성을 안다면, 컴파일 다형성을 이해하기 쉬울 것이다. 런타임 다형성은 상속과 "virtual" 을 이용해, 런타임 중 객체가 상속 상태에 따라 다양하게 .. 말이 어렵잖아. 코드로 봐 보자. #include class Base { public: virtual void Draw() const { std::cout
C++ Template 검색 결과
이번 항목에선 inline을 언제 사용 해야 되는지에 대한 논쟁이다. 대부분 inline을 과용 하고 있어, 문제가 될 소지가 많이 있다고 허브셔터는 지적한다. 허브 셔터는 3개의 질문을 통해서 한번 생각해 보라고 한다. 1. inline이 하는 일은? 함수를 inline으로 만들면 컴파일러는 함수가 쓰이는 곳마다 함수의 코드를 직접 복사해서 붙인다. 이렇게 되므로써, 컴파일러는 함수 호출 코드를 만들지 않고 함수를 마음껏 실행 할 수 있다. 2. inline 함수를 만들면 효율성이 높아지나? 꼭 그런 것만은 아니다. 만약 여기서 "무엇을 최적화 하려 하는가?"를 질문하지 않았다면, 바로 함정에 빠진것이라고 한다. 왜냐하면 inline의 효율은 함수 호출 비용만 줄여 줄 수 있을 뿐이기 때문이다. a )..
C++ 템플릿은 상당히 자유롭게 코딩을 할 수 있는 "즐거움" 선사해 준다. 이런 "즐거움" 자신이 생각한게 무척 잘 돌아간는 느낌에서 온다. 그러면 이제 무척 잘 돌아간다는 "사례"를 한가지 들어 보자. 만약 자신이 문자열을 정렬하는 로직을 만들어야 한다고 가정하자. 문자열 정렬을 위해서, ① 문자열이 있어야 하고, ② 문자열이 저장된 원소의 타입을 알아야 되고, ③ 정렬 방법에 대해서 알아야 한다. 여기서 큰 문제가 하나 있다. 각 나라마다 문자열을 정렬하는 기준이 다르고, 특정 나라는 문자열을 정렬하는데, 많은 방법 들이 있기 때문이다. 이 중, ①, ② 은 원래 생각할 수 있을 법한 것이기에 크게 생각을 요구(.. 유니코드 쓰지 뭐. 아니면 UTF-8 이나..)하지 않고, ③ 의 경우.. 정렬 방..
함수 템플릿의 경우 템플릿 매개변수가 함수의 인자에서 추론 될 수 있음을 알게 되었다. 이 추론 때문에, 함수 오버로딩이란 기능을 이용하기 위해선, 몇가지 규칙을 이해하고 있어야 하는 리스크가 있다. 물론 함수 템플릿을 사용 하는것에 비하면 아무것도 아니지만...우선 코드를 보고, 어느게 호출 될지 생각해 보자. #include template T sqrt( T ); template T std::complex sqrt( std::complex ); double sqrt( double ); void f( std::complex z ) { sqrt( 2 ); sqrt( 2.0 ); sqrt( z ); } 13, 14, 15 라인에서 어떤 함수가 호출 될 것이라고 생각 하는가? 13 라인에선 맨 위의 함수 템..
템플릿 인스턴스화 시점이 템플릿 매개변수를 넘겨서, 그 템플릿이 사용 되어질 때라고 정리 했었다. 그렇다면 "매개변수"란? 도데체 무엇일까? 일반 함수의 매개변수는 매개변수 타입의 값이다. 그렇다면 템플릿 매개변수의 타입은 무엇이 있을까? 두가지로 정할 수 있는데, 한가지가 바로 C++에서 타입으로 인정되는 것이 매개변수 타입 중 1개 이고, 컴파일 타임에 인식 될수 있는 상수형 값 이 마지막 타입이 된다. 정리 하자면, 1. C++ 에서 인정되는 타입 2. C++ 에서 컴파일 타임에 인식되는 값 이 두가지가 템플릿 매개변수가 된다. C++ 에서 타입으로 인정 되는게 무엇일까? int, unsinged int 등등등 기본 타이과 사용자 타입, 그리고 템플릿 타입이 있다. 템플릿 타입은 역시 템플릿이 사용..
최근댓글