티스토리 뷰

 이번에 연습할 문제는 다양한 타입의 데이터 여러 개를 인자로 받아 공통 타입으로 변환하는 함수를 만들어 보는 예제이다. 

 

이 함수가 반환하는 컨테이너는 모든 인자를 공통 타입으로 변환하여 저장하며, 전체 원소를 빠르게 순회할 수 있어야 한다.


#include <iostream>  
#include <array>  
#include <type_traits>  
  
using namespace std;  
  
template<typename ... Args>  
auto build_array(Args&&... args) -> array<typename common_type<Args...>::type, sizeof...(args)> {  
	using commonType = typename common_type<Args...>::type;  
	return {forward<commonType>((Args&&)args)...};  
};  
  
int main() {  
	auto data = build_array(1, 0u, 'a', 3.2f, false);  
	  
	for(auto i : data) {  
		cout << i << " ";  
	}  
	cout << endl;  
}

 

이번엔 그냥 "문법"적으로 좀 막혀서...ㅋㅋ 한 줄 한 줄 뜯어보며 설명을 추가해야겠다.


함수 템플릿 선언부

template<typename ... Args>
auto build_array(Args&&... args) -> array<typename common_type<Args...>::type, sizeof...(args)>
  • template<typename ... Args>는 가변 템플릿 인자를 선언하는 구문이다. 여기서 Args...는 다양한 타입의 인자들을 나타낸다.
  • auto build_array(Args&&... args)는 함수가 가변 수의 인자를 받을 수 있게 한다. 여기서 사용된 Args&&...는 전달 참조를 의미하며, lvalue와 rvalue 참조 모두를 처리할 수 있다.
  • -> array<typename common_type<Args...>::type, sizeof...(args)>는 후행 반환 타입을 명시하는 부분이다. 이는 함수가 std::array를 반환함을 나타내며, 배열의 요소 타입은 인자들의 공통 타입(common_type<Args...>::type)으로 결정되고, 배열의 크기는 전달된 인자의 수(sizeof...(args))와 같다.

함수 구현부

{
    using commonType = typename common_type<Args...>::type;
    return {forward<commonType>((Args&&)args)...};
}
  • using commonType = typename common_type<Args...>::type;는 Args...의 공통 타입을 commonType이라는 별칭으로 정의하는 구문이다.
  • return {forward<commonType>((Args&&)args)...};는 각 인자를 commonType으로 완벽하게 전달하는 역할을 한다. 여기서 사용된 forward 함수는 인자들의 원래 타입(값이 lvalue인지 rvalue인지)을 유지하면서 commonType으로 변환한다.

요약

이 함수는 다양한 타입의 인자들을 받아, 그 인자들의 공통 타입을 가지는 std::array를 생성하여 반환한다. 이 과정에서 완벽한 전달(perfect forwarding)을 사용하여 인자들의 원래 값 카테고리를 보존한다. 이러한 구현은 함수가 다양한 타입의 인자들을 효율적으로 처리할 수 있게 하며, 유연하고 범용적인 사용을 가능하게 한다.

 
 
반응형

'C++ > 연습 문제' 카테고리의 다른 글

[C++] Binary Search Tree  (0) 2024.01.06
[C++] Binary Tree: 순회  (1) 2024.01.05
[C++] 연습 문제 1. 동적 크기 배열 구현  (0) 2023.12.16
Comments