- 잘 알려지지 않은 C++0x의 유용한 기능들 - 두번째
Tweet
- Game Development
- 2009/07/29 05:02
- C++, C++0x, decltype, explicit, initializer, initializer lists, lambda, Range, 람다, 범위
-
명시적 변환 연산자explicit conversion operators
C++98에서는 혼란을 유발하는 암묵적 변환을 방지하지 위해 다음과 같이 변환 생성자에 명시적이어야 함을 지정할 수 있었습니다.
하지만 가능한 변환을 정의하는 방법은 이것 말고 하나가 더 있죠. 해당 클래스를 수정할 수 없는 경우, 상대편 클래스에 변환 연산자를 정의해주는 것이 그것입니다.
이 경우 이전에는 명시성 지정이 불가능했는데 C++0x에서 다음과 같이 가능해졌습니다.
범위 for 구문range for statement
begin()과 end() 함수로 규정되는 범위에 대한 반복을 간편한 문법으로 제공하는 기능입니다.
반환형 접미 구문suffix return type syntax
다음과 같은 함수 템플릿이 있습니다.
이 경우 반환형이 무엇일까요? 물론, x*y의 타입입니다만, 그를 어떻게 나타내느냐는 것이죠. C++0x의 decltype을 사용할 수 있습니다.
하지만 그 시점에 x, y가 스코프에 없기 때문에 오류입니다. 다음과 같이 하면 됩니다.
하지만 역시 만족스럽지 않습니다. 그래서 나온 해법이 반환형을 인자 다음에 선언할 수 있게 하는 겁니다.
[]는 람다에서 도입된 것으로 "반환형이 유도될 수 있거나 나중에 지정될 것임"을 나타냅니다. 이와 같이 함수가 리턴문으로만 구성된 경우에는 다음과 같이 decltype도 생략할 수 있습니다.
클래스 내 멤버 초기화in-class member initializers
C++98에서는 정수형의 static const 멤버에 대해서만 클래스 내 초기화가 가능했습니다.
C++0x에서는 비정적 데이터 멤버를 선언 시에 초기화할 수 있습니다. 이는 생성자가 많은 다음과 같은 경우에 아주 유용합니다.
hash_algorithm과 s 변수가 하나의 초기값만을 가짐에도 각 생성자마다 작업을 되풀이해야 합니다. 유지보수에 쥐약이죠. 이를 다음과 같이 할 수 있습니다.
생성자 초기화 목록이 클래스 내 선언 시점 초기화보다 우선한다는 점을 이용하면, 다음처럼 더 간단히 할 수도 있습니다.
목록 초기화initializer lists
다음과 같은 것들이 가능합니다.
목록 초기화가 더 이상 배열에만 국한되지 않는 것이죠. {}-목록을 받아들이는 것은 std::initializer_list<T> 타입의 인자를 가지는 함수들(보통 생성자)입니다. 가령,
컨테이너는 다음과 같이 "목록 초기화 생성자"를 제공할 수 있습니다.
표준 라이브러리의 컨테이너들은 이제 목록 초기화 생성자를 지원하고, 범위 for 구문에 나온 것처럼 이러한 초기화 목록은 범위(range)로도 활용 가능합니다.
이번 회는 여기까지입니다. 다음 회면 대충 마무리될듯. ^^
* 이 포스트는 blogkorea [블코채널 : 웹, 컴퓨터, it에 관련된 유용한 정보 및 소식] 에 링크 되어있습니다.
'Game Development' 카테고리의 다른 글
| 잘 알려지지 않은 C++0x의 유용한 기능들 - 마지막 (2) | 2009/08/07 |
|---|---|
| 크라이텍 한국 지사에서 일할 프로그래머분들 모십니다 (14) | 2009/08/01 |
| 잘 알려지지 않은 C++0x의 유용한 기능들 - 두번째 (2) | 2009/07/29 |
| 잘 알려지지 않은 C++0x의 유용한 기능들 - 첫번째 (8) | 2009/07/23 |
| Parallelism이란 무엇인가?! (0) | 2009/07/22 |
| 두가지 C++ 차세대 병렬 플랫폼 간단 비교 (1) | 2009/07/21 |











Recent comment