모던 C++의 새로운 기능 익히기
auto 키워드로 데이터 타입을 자동으로 정의하기
auto a = 1; // int
auto b = 1.0; // double
auto add(int i, int j) // 반환 타입 추론
{
return i + j;
}
auto add(int j, int j) -> int // 후행 반환 타입
{
return i + j;
}
초기화에 선언된 변수의 실제 타입을 "컴파일 타임"에 추론하기 위해 사용한다.
변수 뿐만 아니라 함수의 반환 타입도 자동으로 추론한다.
반환타입에 auto를 사용하더라도 반환 타입을 지정할수도 있다.
함수의 매개변수에 auto 타입을 사용할 수 없지만 람다 함수의 매개변수에는 사용이 가능하다. (클로저는 런타임에 생성되기 때문에 가능한 것으로 보인다.)
auto 타입 반환은 C++11부터 가능해졌다.
덧붙여서 C++11에서의 auto 타입 반환에는 반드시 후행 반환 타입이 지정되어야 했지만 C++14부터는 생략이 가능해졌다.
decltype 키워드로 표현식 타입 질의하기
decltype(declared type, 선언된 형식)은 객체나 표현식의 타입을 "컴파일 타임"에 추출하고 싶을 때 사용한다.
const int func1();
const int& func2();
int i;
struct X { double d; };
const X* x = new X();
decltype(func1()) f1; // func1()의 반환 타입을 사용해서 const int f1 선언
decltype(func2()) f2; // func2()의 반환 타입을 사용해서 const int& f2 선언
decltype(i) i1; // i의 타입을 사용해서 int i1 선언
decltype(x->d) d1; // x의 멤버변수 d의 타입을 사용해서 double d1 선언
decltype((x->d)) d2; // 표현식 x->d의 주소 타입을 사용해서 const double& d2 선언
auto와 decltype을 조합하면 간결하게 코드를 작성할 수 있다.
template<typename I, typename J>
auto add(I i, J j) -> decltype(i + j) // decltype(auto) add(I i, J j) 같은 의미이다
{
return i + j;
}
만약 반환 타입이 auto임에도 후행 반환 타입을 지정하지 않았다면 의도하지 않은 결과가 나올 수 있다.
후행 반환 타입을 지정하지 않는다면 반환 타입을 auto 대신 decltype(auto)로 하는것이 안전하고 간결해진다.
참고로 decltype((x->d))처럼 표현식이 lvalue라면 똑같이 lvalue 참조로 보고된다.
null 포인터
과거부터 사용되던 NULL 매크로를 대체하기 위해 만들어졌다. 모호함이 해결된다.
void funct(const char *);
void funct(int);
funct(NULL); // 널 포인터인지 0인지 모호해진다
funct(nullptr); // 확실하게 널 포인터이다
비멤버 함수 begin()과 end()
본래 begin과 end는 각 컨테이너에서 제공되는 멤버 함수였다. 그래서 배열같은 경우는 인덱스를 이용해서 순회해야 했다.
하지만 C++11부터 비멤버 함수로도 제공된다.
int arr[] = {0, 1, 2, ... };
for(unsigned int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) // 과거 스타일의 배열 순회
for(auto i = std::begin(arr); i != std::end(arr); ++i) // 비멤버 begin, end 사용
더 이상 배열의 길이를 신경쓰지 않아도 되기 때문에 코드를 간결하게 작성할 수 있다.
std::vector<int> v;
auto iter1 = v.begin();
auto iter2 = std::begin(v);
당연히 둘은 동일한 타입으로 추론된다.
범위 기반 for 루프로 컬렉션 내 요소 순회
모던 C++은 컬렉션 내 요소를 순회하기 위해 범위 기반 for 루프를 제공한다.
int arr[] = { 0, 1, 2, .. };
for(auto a : arr)'도서 > 모던 C++로 배우는 함수형 프로그래밍' 카테고리의 다른 글
| 함수형 프로그래밍에서 함수 다루기 (2) (0) | 2022.12.09 |
|---|---|
| 함수형 프로그래밍에서 함수 다루기 (1) (0) | 2022.12.09 |
| 모던 C++와 친숙해지기 (4) (0) | 2022.12.09 |
| 모던 C++와 친숙해지기 (3) (0) | 2022.12.08 |
| 모던 C++와 친숙해지기 (2) (0) | 2022.12.08 |
