본 글은 코드누리의 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 |
댓글