일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 함수 객체
- exception
- effective stl
- 메타테이블
- 상속
- 비교 함수 객체
- effective modern c++
- 반복자
- 다형성
- lua
- Effective c++
- reference
- UE4
- implicit conversion
- 영화
- 스마트 포인터
- 암시적 변환
- 티스토리챌린지
- 영화 리뷰
- c++
- more effective c++
- 오블완
- 언리얼
- Smart Pointer
- virtual function
- resource management class
- 게임
- 참조자
- operator new
- 예외
- Today
- Total
목록Effective C++ (148)
스토리텔링 개발자
항목 42. less는 operator less의 기본 동작아래처럼 기본적으로 무게로 정렬되는 Widget이 있다.class Widget{public: ... size_t weight() const; size_t maxSpeed() const; // 무게로 정렬되는 operator헌데, 최대 속도(maxSpeed)를 가지고 정렬하는 multiset을 만들고 싶다면?multiset의 기본 비교 함수는 less이다.하지만, less은 기본적으로 Widget 객체 두 개에 대해 operator 문제 해결하기(잘못된 예)템플릿 특수화로 less과 operator// 템플릿 특수화로 처리한다.templatestruct std::less{ bool operator()(cons..
항목 41. ptr_fun, mem_fun, mem_fun_ref의 존재에는 분명한 이유가 있다 참고 : 현재도 사용할 수 있지만, 람다 등에 의해 이제 사용 빈도가 지극히 낮아졌다.ptr_fun, mem_fun, mem_fun_ref가 하는 일우선 함수 호출 문법 종류를 알아보자.f(x); // 1. 멤버 함수가 아닌 경우x.f(); // 2. x의 멤버 함수인 경우xp->f(); // 3. x의 멤버 함수이나, x의 포인터로 호출된 경우그리고 아래의 코드를 보자.// case 1void test(Widget& w); // w를 검사하고, 실패 시 failed를 출력하는 함수vector vw1;...for_each(vw1.begin(), vw1.end(), test); // 컴파일 성공// 이 경우..
항목 40. 함수 객체 클래스는 어댑터 적용이 가능하게(adaptable) 만들자 C++11 이후로는 더 이상 맞지 않는 이야기이므로 참고할 것.ptr_fun와 adaptable아래는 잘 동작하는 코드이다.list widgetPtrs;bool isInteresting(const Widget* pw);list::iterator i = find_if(widgetPtrs.begin(), widgetPtrs.end(), isInteresting);if(i != widgetPtrs.end()){ ... // interesting한 widget에 대한 첫째 포인터 처리}그렇다면 int..
항목 39. 술어 구문은 순수 함수로 만들자 술어 구문(predicate)bool값을 반환하는 함수판독의 기준이 되는 로직을 포함하는 구문이다. 순수 함수(pure function)함수가 반환하는 값이 그 함수의 매개 변수에 종속되는 함수f(x, y)의 반환값은 x, y가 바뀔 때에만 변한다.즉, 매개변수가 아닌 내부에 존재하는 데이터는 const여야 한다. 술어 구문 클래스(predicate class)operator()가 술어 구문인 함수 객체 클래스 술어 구문 클래스는 복사에 신경써야 한다.함수 객체는 값으로 전달되기 때문이다.(항목 38 참조)그리고 STL 알고리즘이 내부적으로 함수 객체의 사본을 따로 보관할 수도 있다.그러므로 술어 구문 함수는 반드시 순수 함수여야 한다. 잘못 ..
항목 38. 함수 객체 클래스는 값으로 전달되도록(pass-by-value) 설계하자 매개변수로서의 함수와 함수 객체함수는 포인터 형태로 매개변수로 넘겨진다.void qsort(void* base, size_t nmemb, size_t size, int (*cmpfcn)(const void*, const void*));// cmpfcn을 자세히 살펴보면 값으로 전달되고 있음을 알 수 있다.// 즉, 함수 포인터는 값으로 전달된다.STL 함수 객체는 이 함수 포인터를 본떴으므로, 동일하게 값으로 전달된다.templateFunction for_each(InputIterator first, InputIterator last, Function f);// Function은 값 전달 / 값 반환이 이루어짐을 알..
항목 37. 범위 내의 데이터 값을 요약하거나 더하는 데에는 accumulate나 for_each를 사용하자 범위 요약(summarize)예를 들자면컨테이너 string 요소들의 길이의 총합을 구한다.주어진 범위의 숫자들의 곱을 구한다.좌표 등 2차원 이상의 값들의 평균을 구한다. 헤더에 있는 수치 알고리즘인 accumulate을 사용하자. accumulateaccumulate의 첫 번째 형태두 개의 반복자와 초기값을 인자로 받는다.범위 내의 값의 합 + 초기 값을 반환한다.list ld;...double sum = accumulate(ld.begin(), ld.end(), 0.0);// 0.0을 초기값으로 주었기에, 합을 double로 하여 정상값이 리턴된다.double sum = accum..
항목 36. copy_if를 적절히 구현해 사용하자 copy 알고리즘모던 C++ 이전에는 아래와 같은 copy 알고리즘들만이 있었다.copycopy_backwardreplace_copyreverse_copyreplace_copy_ifunique_copyremove_copyrotate_copyremove_copy_ifpartial_sort_copyuninitialized_copy즉, copy_if가 없어서 구현해야 했다.어떤 식으로 구현해서 사용했었는지 재미로나마 알아보자. copy_if가 필요한 상황bool isDefective(const Widget& w); // Widget이 문제가 있는지 알려주는 함수vector widgets;...// c++11 이전에는 이게 안됐다..copy_if(widg..
항목 35. 대소문자를 구분하지 않는 문자열 비교는 mismatch 아니면 lexicographical_compare를 써서 간단히 구현할 수 있다. 대소문자를 구분하지 않기구분하지 않는 정도를 얼만큼이나 원하는가.국제화(internationalization) 사항은 무시하고 단지 strcmp 동작 정도만 원한다면 쉽다.다국어 처리까지 원한다거나, 기본 로케일 이외의 로케일을 사용한다면 어렵다.하지만 이번 항목에서 다루는 것은 쉬운 버전이다. 문자열을 비교하는 인터페이스 두 가지strcmp와 비슷한 인터페이스음수, 0, 양수를 반환한다.operatortrue, false를 반환한다. 첫 번째 버전// 대소문자 구분 없이 문자 비교 함수int ciCharCompare(char c1, char c..