본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 15. C++ 후위 반환 타입 trailing return type

by 신림83 2020. 10. 25.
반응형

CPP 초급 강좌 15. C++ 후위 반환 타입 trailing return type

c++11 부터 후위반환 타입 이라는 표현법이 생겼습니다.

// int f1(int a)
// auto f1(int a) -> int

auto f1(int a) -> int
{
	return a + a;
}

int main()
{
	f1(0);
}

 맨 위의 주석 두 줄은 완전 같은 형식의 표현입니다. 우리에게 익숙한 방식은 아무래도 int f1(int a) 형식이겠죠. 이것을 다음과 같이 auto f1(int a) -> int라고도 표현할 수 있습니다. 

 함수 앞에 리턴타입을 지우고, auto를 쓰시고, 뒤에 -> 반환 타입을 표기하는 것입니다.

 이러한 표현방식을 후위 반환 타입 표현 방식이라 하고, trailing return type, suffix return type 라고 말합니다.

 

 이러한 표현 방식은 람다와, 함수 템플릿 제작시 유용하게 사용됩니다.

 

템플릿 함수에서 후위 반환 타입이 필요한 경우

템플릿 인자가 둘 이상?

template<typename T>
T f1(T a, T b)
{
	return a + a;
}

int main()
{
	f1(1,2);
}

위와 같은 코드를 제작하였습니다. 문제없이 작 작동합니다. 

f1(1,2); 코드를 f1(1,2.5f); 로 변경한다면 어떨까요? 이는 작동하지 않습니다. 위의 템플릿 코드에서는 타입형을 T 하나만 사용하기 때문입니다. 코드 수정을 해볼까요?

template<typename T1, typename T2>
T f1(T1 a, T2 b) // a
{
	return a + a;
}

int main()
{
	f1(1,2.5f);
}

 f1(1,2.5f);를 지원하기 위해서 T 인자를 두 개로 준비하였습니다. T1, T2 그런데, 반환 타입은 어떻게 처리해야 할까요?

 

 

반환타입은 return 형과 동일해야 합니다.

 

 이 경우에 국한하여 우리는 호출 인자를 알기 때문에 결과를 알겠죠. float 형이 될 것입니다. 해당 케이스에만 T2가 될 것인데, 하지만 다른 사람들이 사용할 때는 어디와 일치하는 타입이 올 줄 모르니,

 

 템플릿인 만큼 사용자가 어디에 어떤 형식을 넣을지 미리 추론할수가 없잖아요, return 형식을 받을 수 있게 해야 합니다. 이를 템플릿에 어떻게 표현해야 할까요? 추가 수정을 해보겠습니다.

template<typename T1, typename T2>
decltype(a+b) f1(T1 a, T2 b) // a
{
	return a + a;
}

int main()
{
	f1(1,2.5f);
}

 decltype(a+b) 를 사용하여 합의 형식을 참조하려 합니다. auto, decltype 관련하여 지식이 없다면, 아래 링크를 참조하여 공부하시면 됩니다.

auto, decltype 관련링크

 

CPP 초급 강좌 8. C++ auto, decltype

CPP 초급 강좌 8. C++ auto, decltype auto?  c++11 이후로 사용 시, 데이터 타입 추론기능을 가진 키워드, 초기화 값에 따라 알아서 데이터 타입을 정해주는 키워드 예제를 봅시다. int a[7] = { 1,2,3,4,5,6,7..

sillim83.tistory.com

하지만 위의 코드는 정상동작하지 않습니다.

컴파일러는 알아먹지 못한다.

decltype(a+b) 은 문맥상 T1 a, T2 b 의 앞에 존재하고 있습니다. 즉 선언되기 이전에 사용하려 한 것이죠. 이는 문법 오류입니다. 아래 코드와 같은 느낌이라 보시면 됩니다. a, b 자체를 알 수 없는 경우이죠.

a = a + b; //선언보다 코드가 앞선 겨웅
int a, b;

그래서 후위 반환 타입 이라는 표현이 나오게 된 것이죠.

template<typename T1, typename T2>
auto f1(T1 a, T2 b) -> decltype(a + b)
{
	return a + a;
}

int main()
{
	f1(1,2.5f);
}

위와 같이 정리될 수 있겠습니다.

 

C++14 부터는 -> decltype(a+b)를 지우셔도 됩니다.

//auto f1(T1 a, T2 b) -> decltype(a + b)

template<typename T1, typename T2>
auto f1(T1 a, T2 b) // c++14 부터는 이렇게도 표현가능
{
	return a + a;
}

int main()
{
	f1(1,2.5f);
}

return 타입을 기반으로 반환형을 추론합니다. 컴파일러가 C++14를 지원해야 정상 동작할 것입니다. 

auto f1(T1 a, T2 b) -> decltype(a + b)
auto f1(T1 a, T2 b)

두 코드는 완전히 동일한 코드가 아니지만, 지금을 수준에서는 이해하기 쉬운 이야기는 아닙니다.

일단 이렇게 되는구나 하고 넘어가는...

공부는 쭉 하면 되는 거시니까요. 난중에 아실 수 있을 거예요

 

배울게 너무 많다... 힘든 세상

 봐주셔서 감사합니다.

반응형

댓글