C++ 후행 반환 타입(Suffix Return Type) - 13. 실습 및 연습 문제
13. 실습 및 연습 문제
후행 반환 타입(trailing return type)은 C++에서 함수의 반환 타입을 보다 유연하게 표현하기 위한 강력한 도구입니다. 본 항목에서는 학습자가 이해를 점검하고 직접 코드를 작성해볼 수 있도록 실습 문제를 난이도별로 구성하였습니다.
🧩 기본 문제 (기초 개념 익히기)
1. 전통적인 함수 선언을 후행 반환 타입 방식으로 변환하기
다음 함수들을 후행 반환 타입 형식으로 다시 작성해보세요:
int multiply(int x, int y) {
return x * y;
}
double divide(int x, int y) {
return static_cast<double>(x) / y;
}
✅ 연습 목표: auto와 -> 반환타입의 기본 사용법 이해하기
2. 참조를 반환하는 함수 작성
정수 배열의 특정 요소에 대한 참조를 반환하는 함수를 작성해보세요. 후행 반환 타입을 사용하여 정확하게 참조 타입을 명시해야 합니다.
// 배열과 인덱스를 받아 해당 요소를 참조로 반환하는 함수
// 반환 타입은 int& 또는 const int&가 될 수 있습니다.
✅ 연습 목표: 참조 반환 시 후행 타입으로 정확한 타입 표현하기
🧠 중급 문제 (유형별 조합 활용)
3. SFINAE 기법과 후행 반환 타입 결합하기
입력된 타입이 정수형일 경우에만 동작하는 함수 process를 작성해보세요.
정수형일 경우 두 배를 반환하고, 그렇지 않으면 컴파일되지 않도록 구현하세요.
template<typename T>
auto process(T value) -> /* std::enable_if_t 조건 */ {
// 정수형이면 value * 2 반환
}
✅ 연습 목표: 후행 반환 타입에서 std::enable_if_t를 활용해 조건부 함수 활성화 구현
4. 복잡한 타입을 반환하는 함수 작성
문자열 키와 정수 값을 가지는 std::map 여러 개를 담은 std::vector를 반환하는 함수를 후행 반환 타입으로 작성해보세요.
// 반환 타입: std::vector<std::map<std::string, int>>
✅ 연습 목표: 중첩 템플릿 타입을 후행 반환 타입으로 명확하게 표현
🔧 고급 문제 (메타프로그래밍과 라이브러리 구성)
5. 템플릿 메타프로그래밍과 결합한 함수 작성
두 타입 T와 U의 합을 반환하되, decltype을 활용해 정확한 연산 결과 타입을 후행 반환 타입으로 지정하세요.
단, T와 U는 서로 다른 타입일 수 있습니다.
template<typename T, typename U>
auto sum(T a, U b) -> decltype(/* 표현식 기반 타입 */) {
// 합산 결과 반환
}
✅ 연습 목표: decltype + 후행 반환 타입 조합을 통해 표현식 기반 반환 타입 처리
6. 범용 유틸리티 함수 라이브러리 설계
아래 조건을 만족하는 간단한 유틸리티 함수 모듈을 작성해보세요:
- getFirstElement: 컨테이너의 첫 요소를 반환 (decltype(auto) 활용)
- createObject: 가변 인자를 받아 std::unique_ptr<T> 생성
- invoke: 임의의 함수 호출을 전달인자와 함께 실행 (perfect forwarding + decltype(auto))
각 함수에 후행 반환 타입을 활용해 구현하고, 별도의 헤더 파일에 묶어 정리해보세요.
✅ 연습 목표: 실전에서 재사용 가능한 범용 함수 작성 능력 향상
✅ 추가 연습: std::forward, decltype(auto)와 후행 반환 타입의 조합 사용
✅ 마무리 팁
실습을 진행할 때는 다음을 점검하며 작성하면 학습 효과가 더욱 높습니다:
- 반환 타입을 명확히 표현했는가?
- 후행 반환 타입이 필요한 이유가 있는가? (예: 매개변수 기반, 참조 유지 등)
- 타입 추론으로 충분한가, 아니면 명시가 필요한가?
- SFINAE나 decltype, decltype(auto)를 적절히 활용했는가?