본문 바로가기

MCPPD

(4)
Part 2, 테크닉 : 2-10 Traits 자료형 템플릿 코드를 쓰다 보면 템플릿 파라미터인 T가 어떤 특성을 가지고 있는지 알아야 할 때가 있다. 예를 들자면, swap 을 하려 할 때, POD 형이라면, memcpy 를 이용하여 복사 하고 아닌 경우라면, 생성자 호출에 의한 값 복사를 진행하면 꽤 좋은 성능을 낼 수 있기 때문이다. 이번 장에선 템플릿 파라미터인 T의 특성을 컴파일 타임에 확인하는 테크닉에 대해서 설명한다. 이러한 테크닉의 설명에 앞서 이미 만들어진 라이브러리(Boost.TypeTraits)도 있다는 것을 미리 밝힌다. 2.10.1 포인터 Traits의 구현 쉽게 말해서 포인터 형인지 확인하는 테크닉이다. 코드를 보면 한번에 알 수 있을 테니 코드를 적어 둔다. // 책의 소스를 조금 손 보았다. ikpil #include #incl..
Part 2, 테크닉 : 2-7 형변환과 상속 가능의 여부를 컴파일 타임에 일어 내는 방법 이 테크닉은 여러 책에서도 소개 되어 있다. 쉽게 말해서 "컴파일 타임 상속 여부 체크" 기능이다. 어떻게 형변환과 상속 가능 여부를 알 수 있는가? 일반적으로 사람의 눈으로 "형변환과 상속 가능 여부" 를 알기 위해선 해당 소스코드를 직접 보면 된다. 마찬가지로 컴파일러도 "볼수 있게" 만들어주면 되는데, 형변환 또는 상속 가능 여부 컴파일러가 "볼 수 있게"를 할려면, 몇가지 트릭이 필요하다. 결론은 알 수 있다는 것이다. 이 방법은 객체가 복사 될 수 있다면 컴파일러가 알아서 복사 하는 원리를 이용한 것이다. 하지만 이것을 일일이 컴파일 해보면서 알아 갈려면 정말 힘든 작업 이다. 그래서 여러 선구자들은 sizeof 트릭을 개발하였고, 이 트릭이 나오게 된다. 참고로 sizeof 연산자는 컴파일 타..
Part 2, 테크닉 : 2-3 로컬 클래스 로컬 클래스란 지역 클래스를 말한다. ... 지역 클래스라 하니 좀 그런데, 지역 변수 처럼, 지역에서만 쓰일 수 있는 클래스를 말한다. 역시 코드로 정리하는게 빠르겠다. void f() { class LocalClass { // ..... 정의 }; LocalClass d; // .. 이용한다. } 위에선 함수안에 로컬 클래스를 정의 했지만, 클래스 내부도 가능하고 { } 안에서도 가능하다. 비슷한 개념으로 함수안에 함수를 정의할 수 있지 않을까? 라고 생각 했다면, 당신은 이미 센스 쟁이이다. 하지만 안타깝게도 C++에선 지원해 주지 못한다. 어찌되었든,책의 내용을 인용하자면 "로컬 클래스는 새로운 이론을 가능하게하는 기법은 아니지만 구현을 단순화 시키고, 심볼의 지역성을 높여주는 데 기여하는 기법"..
Part 2, 테크닉 : 2-2 템플릿의 부분 특화 템플릿의 부분 특화(Partial Template Specialization)란 그 템플릿이 구체화 가능한 인스턴스화 중 특정 부분 집합에 대응 시키는 것을 뜻한다. ..,, 말이 좀 어렵다. 아무리 생각해도 이 말은 좀 어렵다. 다시 해석 하자면, "만약 템플릿 파라미터가 A 라면, 이 템플릿 코드를 인스턴스화 해라" 라고 정하는게 템플릿 특화 이고, "만약 템플릿 파라미터들 중 첫번째가 A 라면, 이 템플릿 코드를 인스턴스화 해라" 이것이 템플릿 부분 특화 이다. 그럼 코드로 정리해 보자 // 아래 코드는 일반적인 클래스 템플릿 코드이다. template class Widget { // 일반화 시킬 구현 코드 }; // 아래 코드는 위의 클래스 템플릿을 특수화 시킨 코드이다. template clas..