본문 바로가기

분류 전체보기40

6일차 - CRTP (Curiosly Recurring Template Pattern) Intro 아래 코드의 수행결과를 예상해보자. #include using namespace std; class Window { public: void MessageLoop () { OnClick(); } void OnClick () { cout 2015. 10. 30.
boost의 static_gcd / static_lcm 흉내내기 Intro TMP로 유클리드 호제법을 구현해서 최대공약수와 최소공배수를 컴파일 타임에 얻어보자. #include using namespace std; template struct StaticGreatestCommonDivisor { enum { kValue = StaticGreatestCommonDivisor::kValue }; }; template struct StaticGreatestCommonDivisor { enum { kValue = A }; }; template struct StaticLeastCommonMultiplier { private: static const size_t kGCD = StaticGreatestCommonDivisor::kValue; static const size_t k.. 2015. 10. 28.
6일차 - checked delete Intro 일반적으로 헤더 파일 등에서 다른 유저 정의 타입 A의 포인터 변수만 사용되는 경우에는 아래와 같이 타입 A를 전방선언해서 사용한다. 이처럼 완전한 선언없이 전방선언만 존재하는 타입의 포인터를 불완전 객체(incomplete object)라고 한다.class Test; //< 클래스의 전방선언 Test* p; //< 불완전 객체 불완전 객체는 타입에 대한 정보가 전혀 없기 때문에 delete 시에 객체의 소멸자가 호출되지 않는다는 문제점이 있다. 다음의 코드를 통해서 이러한 상황을 확인해보자.#include using namespace std; class Test; //< 전방선언 void foo (Test* p) { delete p; } class Test { public: Test () {.. 2015. 10. 21.
5일차 - move semantics Intro 포인터를 멤버변수로 가지는 간단한 클래스 하나를 생각해보자. class Cat final { public: Cat (const char* name, int age); Cat (const Cat& rhs); ~Cat (); const char* name () const { return name_; } int age () const { return age_; } private: char* name_; int age_; }; 보통 위와 같이 포인터를 멤버로 가지는 클래스는 복사 생성자에서 깊은 복사(deep copy)를 수행한다. (이하로 이를 일반 복사 생성자라고 칭함) 생성자 내에서의 깊은 복사는 원래 객체의 변경없이 원래 객체와는 완벽하게 독립적인 복사본을 만들어낸다. 하지만 메모리 할당을 수.. 2015. 9. 14.