티스토리 뷰
※ 주의 사항 ※
- 이 글의 목적은 '지식의 전달'이 아닌 '학습의 기록'입니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
auto 타입과 decltype 타입은 C++11에서 나온 타입으로 컴파일러가 자동으로 변수 타입을 추론하여 정할 때 사용합니다. 아래는 예제입니다.
#include <iostream>
int main()
{
auto name = "koey"; //name 변수는 문자열을 저장하므로 const char* 타입
int foo = 0;
auto bar = foo; //bar 변수는 foo 변수의 데이터 타입과 같은 타입으로 인식
decltype(foo) num; //num 변수는 foo 변수의 데이터 타입과 같은 타입으로 인식
return 0;
}
단, 아래와 같이 초기화 없이 사용하는 auto 타입은 컴파일러가 어떤 타입인지 추론할 수 없으므로 에러를 발생시킵니다.
auto age; //타입을 추론할 수 없어 컴파일 에러 발생
만약 함수를 대상으로 반환하는 데이터의 타입을 예측할 수 있다면, 다음과 같이 '->' 람다 형식으로 데이터 타입을 넣어줄 수 있습니다.
auto sum(int a, int b) -> int
{
return a + b;
}
함수가 아닌 변수를 대상으로는 위와 같은 문법이 적용되지 않는 것으로 보입니다. 아래는 예시입니다.
auto myName -> const char*; //에러 발생
그런데 만약 함수가 반환하는 데이터의 타입을 예측할 수 있다면, 앞선 예시와 같이 '->' 람다 형식으로 데이터 타입을 넣어주는 것보다 아래와 같이 반환 타입을 직접 지정해 주는 것이 더 편할 것 같습니다. 즉, 위의 문법이 쓸모없다고 생각될 지도 모릅니다.
int sum(int a, int b)
{
return a + b;
}
하지만 이런 문법은 decltype 타입을 활용하여 함수 템플릿을 대상으로 적용할 때 아주 유용합니다. 아래는 예제입니다.
#include <iostream>
template <typename T, typename S>
auto sum(T a, S b) -> decltype(a + b)
{
return a + b;
}
int main()
{
std::cout << sum(10, 20) << std::endl;
std::cout << sum(10, 20.32) << std::endl;
std::cout << sum(10.47, 20) << std::endl;
std::cout << sum(10.47, 20.32) << std::endl;
return 0;
}
/*
실행 결과
30
30.32
30.47
30.79
*/
auto 타입과 decltype은 유용하게 사용되는 경우도 있지만, 굳이 불필요한 상황에서 이를 남용하게 된다면 디버깅에 어려움을 줄 수 있기 때문에 남용하지 않는 것이 좋습니다. 실제 auto 타입과 decltype은 반복자나 STL에서 제공하는 컨테이너 클래스가 제공하는 길고 복잡한 데이터 타입일 간단하게 명시할 때 주로 사용합니다. 쉽게 말해 auto 타입과 decltype 타입은 복잡한 데이터 타입을 명시할 때, 타이핑 실수가 많아지고 손이 많이 갈 때 사용하면 좋습니다.
'공부 일지 > CPP 공부 일지' 카테고리의 다른 글
C++ | char 타입과 wchar_t 타입 (0) | 2021.08.06 |
---|---|
C++ | void 타입과 unspecified (0) | 2021.08.06 |
C++17 STL | 구조체 형태의 바인딩 (0) | 2021.08.05 |
C++ | C++ 스타일의 형 변환 연산자 (0) | 2021.08.05 |
C++ | 예외상황과 예외처리 (0) | 2021.08.05 |