type_info 는 타입의 정보를 저장하는 클래스이다. type_info 란 클래스는 typeid라는 연산자를 통하여, 생성되고, 그 참조값이 반환 된다. type_info 에 대한 설명은 일전에 정리하였던 문서(http://ikpil.com/685)를 보자. .. 설명에서 나와 있듯이, 실제로 써서 알 수 있듯이 사용하기 좀 힘든 클래스 이다. 그래서 안드레 알렉산드 레스큐는 좀 더 type_info를 쉽게 사용하고자, 다음의 개념을 정리하였다. 복사 생성자와 기본 생성자가 없어, 컨테이너등에 넣을 수 없으니, 만들어야만 한다. 첫번째에 의해서 포장되었으니, 다른 비교 연산자 등을 재정의해야만 한다. .. 개념을 알았으니, 각자 만들어 보자.( 책에 소스 코드도 역시 .. 선언만 되어 있다. ) 나는..
IT 검색 결과
이 테크닉은 여러 책에서도 소개 되어 있다. 쉽게 말해서 "컴파일 타임 상속 여부 체크" 기능이다. 어떻게 형변환과 상속 가능 여부를 알 수 있는가? 일반적으로 사람의 눈으로 "형변환과 상속 가능 여부" 를 알기 위해선 해당 소스코드를 직접 보면 된다. 마찬가지로 컴파일러도 "볼수 있게" 만들어주면 되는데, 형변환 또는 상속 가능 여부 컴파일러가 "볼 수 있게"를 할려면, 몇가지 트릭이 필요하다. 결론은 알 수 있다는 것이다. 이 방법은 객체가 복사 될 수 있다면 컴파일러가 알아서 복사 하는 원리를 이용한 것이다. 하지만 이것을 일일이 컴파일 해보면서 알아 갈려면 정말 힘든 작업 이다. 그래서 여러 선구자들은 sizeof 트릭을 개발하였고, 이 트릭이 나오게 된다. 참고로 sizeof 연산자는 컴파일 타..
이 기술은 내가 제일 아끼는 기술이다. 컴파일타임에 함수 오버로딩을 이용해 분기시키는 기술인데, 가끔식 쓸때마다 정말 재미있다. 이 기술은 다음과 같은 조건일 때 쓸 수 있다. 컴파일 타음에 주어진 상수에 따라 여러개의 함수 중 하나를 호출 해야 할 때 이러한 디스패칭 작업을 컴파일 타임에 결정 할 떄 Effective C++ 3판, 항목 47 : 타입에 대한 정보가 필요하다면 특성정보 클래스를 사용하자. 에 자세히 나온다. 그래도 이번에 다시 한번 정리해 본다. 상수를 타입으로 만들려면 코드 유틸리티가 필요한데, 다음과 같이 만들자. #include template struct int2type { static int const value = v; }; int main( void ) { std::cout..
일단 아래 코드를 컴파일 해보자. 100% 안될 것이라고? 어디에서..? int C; class C; int X; template class X; struct S; template class S; int main( void ) { return 0; } g++43 [ikpil@localhost work]$ g++ -o template_linktest template_linktest.cpp template_linktest.cpp:8: error: ‘template struct X’ redeclared as different kind of symbol template_linktest.cpp:5: error: previous declaration of ‘int X’ template_linktest.cpp:13:..
C++ 기초 책을 보다 보면, 템플릿에 대해서 10장 분량으로 설명만 하고 넘어간다. 그도 그럴것이 방대한 템플릿에 대해서 자세히 설명 할려면 출판사와 저자가 책을 두권 낼지 세권 낼지 스타 한판을 해야 되기 때문이다. 그래서 다른 책들에는 클래스 템플릿의 가상 멤버 함수에 대해 언급하고 있지 않는다.( .. effective, excetional 에 없네; ㅋㅋ 비야네 책에서도 못 찾겠다.) 당연한 것이라서 그럴 수도 있다. 그 당연한 것이 무엇일까? 바로 클래스 템플릿의 가상 멤버 함수는 파라미터화 할 수 없다. 즉, 가상 멤버 함수 템플릿은 존재 하지 못한다는 것이다. 왜 일까? 현재의 C++ 에서 가상 멤버 함수의 경우, 가상 테이블의 1개의 레코드를 사용 한다. 그래서 컴파일 될 때 몇개의 가상..
이번 장에선 그동안 이야기 하지 않았던 템플릿의 제약 사항이나, 예외 상황에 대해서 정리해 보자. 8.1 파라미터화된 선언의 다양한 형태 이런건 그냥 코드 보면 된다. 선언이 무엇이고 정의가 무엇인지 알기 때문에 선언이 어떻게 파라미터화만 봐도 충분하다고 생각 한다. 그래도 코드는 정의 선언 둘 다 나열해 보자. // 클래스의 파라미터화된 선언 예 template class List { public: // 클래스 템플릿에서 멤버 함수의 파라미터화된 선언 예 template List( List const &); }; // 클래스 밖에서 클래스의 멤버 함수를 파라미터화한 정의 예 template template List::List(const List &) { // ... } // 전역에서 함수의 파라미터화된..
최근댓글