제네릭한 스타일 코드에선 Boolean 값의 상수에 따라 두 자료형 중 하나를 선택해야 할 필요가 있다고 책에 적혀 있다. .. 사실 이런 경우를 겪어 볼 만큼 실력이 있지 않아 이런 경우가 있을까? 란 의구심마저 들지만, 어떤 원리가 있는지만 알아 두자. Boolean 값으로 두 자료형 중 한 자료형을 선택하기 #include template struct Select { typedef T ValueType; }; template struct Select { typedef U ValueType; }; struct TestClass { int a1_; int a2_; int a3_; int a4_; int a5_; }; int main( void ) { std::cout
책 정리/Modern C++ Design 검색 결과
이번장은 어떤 테크닉인가? 2.4에서 배운것은 "템플릿"을 이용하여 메모리 손해를 최하(1Byte)로 하여 상수를 타입(자료형)으로 바꾸었다. 이번엔 템플릿을 이용하여 "타입을 다른 타입"으로 바꾸는 테크닉이다. template struct Type2Type { typedef T TYPE; }; 손쉽게 만들 수 있다. 그런데 이것을 배우고 나서 이런 생각이 든다. 이걸 어디에 써먹지? 책에선 함수 템플릿의 부분 특수화를 하기 위해서 사용했다. 그러므로 여기에 대해서는 더 이상 언급하지 않겠다. 사실 책에 무척 자세하고 아주 친절하며, 몹시 재미있게 정리되어 있기 때문이다. 나라면, 컴파일 타임 함수 분기에 타입을 이용 한다면 "함수 호출에 따른 복사 생성자 호출 비용을 최소화하기" 위해서 사용 할 것이다..
이 기술은 내가 제일 아끼는 기술이다. 컴파일타임에 함수 오버로딩을 이용해 분기시키는 기술인데, 가끔식 쓸때마다 정말 재미있다. 이 기술은 다음과 같은 조건일 때 쓸 수 있다. 컴파일 타음에 주어진 상수에 따라 여러개의 함수 중 하나를 호출 해야 할 때 이러한 디스패칭 작업을 컴파일 타임에 결정 할 떄 Effective C++ 3판, 항목 47 : 타입에 대한 정보가 필요하다면 특성정보 클래스를 사용하자. 에 자세히 나온다. 그래도 이번에 다시 한번 정리해 본다. 상수를 타입으로 만들려면 코드 유틸리티가 필요한데, 다음과 같이 만들자. #include template struct int2type { static int const value = v; }; int main( void ) { std::cout..
로컬 클래스란 지역 클래스를 말한다. ... 지역 클래스라 하니 좀 그런데, 지역 변수 처럼, 지역에서만 쓰일 수 있는 클래스를 말한다. 역시 코드로 정리하는게 빠르겠다. void f() { class LocalClass { // ..... 정의 }; LocalClass d; // .. 이용한다. } 위에선 함수안에 로컬 클래스를 정의 했지만, 클래스 내부도 가능하고 { } 안에서도 가능하다. 비슷한 개념으로 함수안에 함수를 정의할 수 있지 않을까? 라고 생각 했다면, 당신은 이미 센스 쟁이이다. 하지만 안타깝게도 C++에선 지원해 주지 못한다. 어찌되었든,책의 내용을 인용하자면 "로컬 클래스는 새로운 이론을 가능하게하는 기법은 아니지만 구현을 단순화 시키고, 심볼의 지역성을 높여주는 데 기여하는 기법"..
템플릿의 부분 특화(Partial Template Specialization)란 그 템플릿이 구체화 가능한 인스턴스화 중 특정 부분 집합에 대응 시키는 것을 뜻한다. ..,, 말이 좀 어렵다. 아무리 생각해도 이 말은 좀 어렵다. 다시 해석 하자면, "만약 템플릿 파라미터가 A 라면, 이 템플릿 코드를 인스턴스화 해라" 라고 정하는게 템플릿 특화 이고, "만약 템플릿 파라미터들 중 첫번째가 A 라면, 이 템플릿 코드를 인스턴스화 해라" 이것이 템플릿 부분 특화 이다. 그럼 코드로 정리해 보자 // 아래 코드는 일반적인 클래스 템플릿 코드이다. template class Widget { // 일반화 시킬 구현 코드 }; // 아래 코드는 위의 클래스 템플릿을 특수화 시킨 코드이다. template clas..
내가 컴파일 타임 어써션(Compile-time assertions)을 처음 써 본것은 BOOST를 알고서 부터였다. 컴파일 타임에 정말 많은 것을 할 수 있다는 계기가 된 함수(?) 인데, 다음 코드를 컴파일 할 때 어떤 경고가 뜨는지 한번 보면, 짭짜른 맛이 느껴지면서, 자꾸 먹고 싶어 진다. #include int main( void ) { BOOST_STATIC_ASSERT( 1 == 1 ); BOOST_STATIC_ASSERT( 1 == 0 ); return 0; } 6번째 라인에서 컴파일이 되지 않는 것을 알 수 있는데, 이게 바로 BOOST_STATIC_ASSERT 이다. 쓸 수 있는 곳은 무궁무진하다. 예를 들어서, 캐스팅 함수를 만든다고 치자, 작은 타입에서 큰 타입으로 캐스팅 하는건 자..
최근댓글