티스토리 뷰

※ 주의 사항 ※

  • 이 글의 목적은 '지식의 전달'이 아닌 '학습의 기록'입니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.

 

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 타입은 복잡한 데이터 타입을 명시할 때, 타이핑 실수가 많아지고 손이 많이 갈 때 사용하면 좋습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
29 30 31
글 보관함