본문 바로가기
C++/[ecourse] C++ Template

3. 배열과 템플릿

by 헛둘이 2022. 9. 26.

본 글은 코드누리의 Template Programming 강좌를 개인 학습 목적으로 정리한 글 입니다.

https://www.ecourse.co.kr/course-status/

 

배열의 이름
  • 배열의 이름을 배열의 주소로 알고 있는데 사실은 그게 아님
  • int x[3] = {1, 2, 3};
  • 변수의 이름은 x, 변수 타입은 int[3]
  • 변수의 이름만 빼면 변수의 타입이기 때문

 

배열 x의 주소를 구하는 방법
  • ? p3 = &x; // ? 자리에 타입이 들어가야 하는데 어떤 타입이 맞을까?
  • int *p3[3] = &x; // 이렇게 하면 주소를 담는 포인터가 되지만 배열 연산자([])의 우선순위가 빨라서 p3[3]이 먼저 계산됨
  • 따라서 int (*p3)[3] = &x 와 같이 담아야 함
#include <iostream>
#include <boost/type_index.hpp>

using namespace std;
using namespace boost::typeindex;


int main()
{
	int x[3] = { 1,2,3 };
	//모든 포인터들은 1을 더하면 자신이 가리키는 요소만큼 커진다.

	int(*p1)[3] = &x; 
    // int 3개의 배열을 가리키는 포인터이므로 1을 더하면 12만큼 커진다

	int* p2 = x;  
    // int 하나를 가리키는 포인터이므로 1을 더하면 4만큼 커진다.
}
  • 배열의 이름은 배열의 1번째 요소의 주소로 암시적 형변환되므로
  • 배열의 이름은 1번째 요소의 주소이다.
  • 배열의 주소와 1번째 요소 주소의 명확히 다른 점은 그 주소에 1을 더하는 것임
  • 주소에 1을 더하면 그 주소가 가리키는 자료의 크기만큼 이동한다.
  • 따라서 int(*p3)[3]에 1을 더하면 12가 이동되고, int *p2에 1을 더하면 4가 이동된다.

 

 

 

 

Argument Decay
  • 배열은 값 복사가 되지 않는다.
int x[3] = {1,2,3};
int x1[3] = x; // error
  • 따라서 아래와 같이 넘길 수 있다.
int x[3] = { 1,2,3 };
int(&rx)[3] = x;		// 참조로 넘김
int(*px)[3] = &x;		// 배열의 주소를 포인터로 받음 
int* p = x;			// 첫 번째 요소의 주소를 포인터로 받음
  • 그렇다면 템플릿에서 받을 때는 어떻게 받을까?

 

#include <iostream>
#include <boost/type_index.hpp>

using namespace std;
using namespace boost::typeindex;

template<typename T>
void foo(T a)
{
	std::cout << type_id_with_cvr<T>().pretty_name() << std::endl;
	std::cout << type_id_with_cvr<decltype(a)>().pretty_name() << std::endl;
	std::cout << std::endl;
}

template<typename T>
void goo(T& a)
{
	std::cout << type_id_with_cvr<T>().pretty_name() << std::endl;
	std::cout << type_id_with_cvr<decltype(a)>().pretty_name() << std::endl;
	std::cout << std::endl;
}

int main()
{
	int x[3] = { 1,2,3 };


	foo(x); // T: int[3]은 에러가 나므로 int*로 결정이 됨
	goo(x); // T: (&int)[3] 배열은 자신과 동일한 값으로 안되지만 참조로는 됨

	// argument decay

	//int(&r)[3] = x;
	//배열을 가리키는 참조 변수
}

int * __ptr64
int * __ptr64

int [3]
int (& __ptr64)[3]

 

  • 템플릿 함수를 값으로 받으면 첫번째 요소의 포인터로 전달받게 되고,
  • 참조로 받으면 배열의 참조로 전달받게 됨

'C++ > [ecourse] C++ Template' 카테고리의 다른 글

6. 템플릿 특수화  (1) 2022.09.29
5. 템플릿 기본 문법 - typename, template  (0) 2022.09.28
4. 템플릿 기본 문법 - 클래스 템플릿  (0) 2022.09.27
2. Template Type Deduction  (0) 2022.09.26
1. Template Instantiation  (0) 2022.09.26

댓글