Game!

전체 글 (93)

  1. 2018.02.22 [펌] 렌더링 파이프라인

    - 렌더링 파이프라인이란? 기하학적으로 3D 장면을 구성하고 가상의 카메라를 설정한 뒤에 모니터에 2D 표현을 만들어내는 과정을 수행해야하는데, 이와 같은 과정을 렌더링 파이프라인 이라고 한다. 파이프라인 내에서 몇 가지 단계에 의해 하나의 좌표 시스템에서 다른 시스템으로 변화하는 과정이 이용되는데, 이 변환에는 행렬이 이용되며, Direct3D의 책임 하에 이루어진다. 1. 로컬 스페이스 모델링 스페이스라고도 불리는 로컬 스페이스(Local Space)는 우리가 물체의 삼각형 리스트를 정의하는 데 이용하는 좌표 시스템이다. 로컬 스페이스는 모델링 과정을 쉽고 단순하게 만들어주며, 모델 자체의 로컬 좌표 시스템을 이용하는 것이 월드에서 직접 모델을 구성하는 것보다 쉽다. 2. 월드 스페이스 로컬 스페이스..

  2. 2018.01.10 [C++] 중첩 클래스 사용 이유

    중첩 클래스는 class 내부에 class를 선언하는 것이다 보통, 외부 class에 내부 class를 선언하는 경우에 / 내부 class를 private 으로 정의한다. 왜냐하면, 특정 클래스 안에서만 사용하는, 또다른 클래스 자료형이 필요할 경우에 이러한 방식을 사용하기 때문이다. https://m.blog.naver.com/PostView.nhn?blogId=kks227&logNo=220179773371&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

  3. 2018.01.10 문자열 코딩 - [아스키코드, 멀티바이트, 유니코드]

    VS 프로젝트 속성 -> 구성속성을 보면문자 집합으로 2가지를 사용할 수 있다.1. 멀티바이트 문자 집합2. 유니코드 문자 집합  아스키 코드(SBCS) - 모든 문자 하나가 1byte를 차지하며 영어를 표현한다. 하지만 아스키 문자 코드 만으로는 한글이나 일어 등의 다른 문자를 표시할 수 없다.   멀티바이트(MBCS) - 1. 아스키 문자 코드에다가 다른문자(2byte)들을 포함한 문자 집합이다.어떤 문자는 1byte고, 어떤 문자는 2byte이다.정확히는 모르겠지만, 한 문자가 2byte를 넘는 문자도 존재할 것이다. 2. 멀티바이트 문자 집합은 특정 문자 집합마다의 코드페이지가 존재한다.예를 들어, 같은 코드 번호 일지라도 한글 코드 페이지로 해석하면 한글이 나오지만,일어 코드 페이지로 해석하면 ..

  4. 2017.12.28 [C++] variadic template

    variadic template 은... 템플릿의 인자를 가변적으로 받을 수 있도록 구현하는 방식이다 참고)variable argument (다양한 인수의 표현) 이것의 심볼로는 ... 을 사용합니다. variadic template을 함수 템플릿 / 클래스 템플릿 2가지로 나누어서 간략히 설명합니다. 12345678910111213 template // template parameter packvoid Function( const Arg1& arg1, const Args&... args ) // function parameter pack{ Test( arg1 ); Function( args... );} void main(){ Function( 1, "ezreal very handsome", 1.5f )..

  5. 2017.12.27 [C++] 템플릿 이것저것(정리중...)

    템플릿 메타 프로그래밍 일반 함수를 써서 재귀호출을 해야하는 문제를, 템플릿 클래스를 이용하면 똑같이 구현할 수 있다. ▶ 템플릿의 원래 기능이 아니라, 템플릿을 이용해서 문제를 푸는 방법 cf. 재귀 호출 방식으로 템플릿을 계속 생성하는 것은, 잘 알려진 대표 템플릿 메타 프로그래밍의 예 템플릿 메서드 패턴 부모 클래스에서 virtual이 아닌 함수 내부에서, 자식의 virtual 함수를 호출한다 자식의 virtual 함수를 호출 : 객체 생성 타입에 따라 적절한 오버라이딩 호출 템플릿 트릭 템플릿 트릭 중 하나가 템플릿 메소드 패턴을 사용하면 virtual 함수를 런타임 때 테이블로 접근해서 호출하는데 이러한 테이블을 접근하는 시간을 단축하기 위해 해결하는 static polymorphism 방법임 ..

 

 

- 렌더링 파이프라인이란?

렌더링 파이프라인

 

 기하학적으로 3D 장면을 구성하고 가상의 카메라를 설정한 뒤에 모니터에 2D 표현을 만들어내는 과정을 수행해야하는데, 이와 같은 과정을 렌더링 파이프라인 이라고 한다. 파이프라인 내에서 몇 가지 단계에 의해 하나의 좌표 시스템에서 다른 시스템으로 변화하는 과정이 이용되는데, 이 변환에는 행렬이 이용되며, Direct3D의 책임 하에 이루어진다.

 

1. 로컬 스페이스

 모델링 스페이스라고도 불리는 로컬 스페이스(Local Space)는 우리가 물체의 삼각형 리스트를 정의하는 데 이용하는 좌표 시스템이다. 로컬 스페이스는 모델링 과정을 쉽고 단순하게 만들어주며, 모델 자체의 로컬 좌표 시스템을 이용하는 것이 월드에서 직접 모델을 구성하는 것보다 쉽다.

 

2. 월드 스페이스

 로컬 스페이스로 구성한 다수의 모델들은 월드 좌표 시스템으로 옮겨 하나의 장면을 구성해야 한다. 로컬 스페이스의 물체들은 이동, 회전, 크기 변환 등을 포함하는 월드 변환이라는 작업을 거쳐 월드 스페이스로 옮겨진다. 월드 변환은 하나의 행렬로 표현되며, 변환 타입에 D3DTS_WORLD를 지정하고 IDirect3DDevice9::SetTransform 메서드를 호출하여 수행할 수 있다.

 

3. 뷰 스페이스

 월드 스페이스 내에서 기하물체와 카메라는 월드 좌표 시스템과 연계되어 정의한다. 그러나 카메라가 월드 내 임의의 위치나 방위를 가진다면 투영이나 그 밖의 작업이 어렵거나 비효율적이되는데, 이를 해결하기 위해 카메라를 월드 시스템의 원점으로 변환하고, 카메라가 양의 z축을 내려다 보도록 회전시키는 작업을 한다. 이러한 변환을 뷰 스페이스 변환이라 하며, 이 변환을 거친 뒤의 기하물체는 뷰 스페이스 내에 위치한다고 말한다.

 

4. 후면 추려 내기(backface culling)

 폴리곤은 두 개의 면을 가지고 있으며 하나의 면을 전면, 다른 면을 후면이라 부른다. 화면에 보이는 일반적인 물체는 전면을 보여주며, 후면의 폴리곤은 보이지 않아야한다. 즉, 후면의 폴리곤을 처리에서 제거하는 작업을 후면 추려 내기라한다. 이 과정 중 Direct3D의 입장에서 어떤 폴리곤이 전면 폴리곤이고 후면 폴리곤인지 확인 할 수 있어야 하는데, 이러한 작업을 두르기 순서라고 한다.

 

5. 조명

 광원은 월드 스페이스 내에 정의되지만, 뷰 스페이스 변환에 의해 뷰 스페이스로 변환 된다. 광원은 물체의 명암을 추가하여 장면의 사실감을 더해준다.

 

6. 클리핑(Clipping)

 시야 볼륨 외부의 기하물체를 추려내는 과정을 클리핑(Clipping) 이라한다. 시야 절두체에서의 삼각형 위치는 다음과 같이 구분할 수 있다.

  • 완전한 내부 - 삼각형이 완전히 절두체 내부에 위치하면 그대로 보존되어 다음 단계로 진행한다.
  • 완전한 외부 - 삼각형이 완전히 절두체 와부에 위치하면 추려내어진다.
  • 부분적 내부 - 삼각형이 부분적으로 절두체 내부에 위치하면 삼각형을 두개의 부분으로 분리한다. 절두체 내부의 부분은 보존되며, 나머지는 추려내어진다.

 

7. 투영(Projection)

 뷰 스페이스에서는 3D 장면의 2D 표면을 얻는 과정이 남아있다. 이와 같이 n 차원에서 n-1 차원을 얻는 과정을 투영(Projection)이라 한다. 원근 투영(Perspective Projection)을 이용하여 기하물체를 투사한다. 즉 카메라에서 멀리 떨어진 물체는 가까운 물체보다 작게 나타난다. 

 

8. 뷰포트 변환

 프로젝트의 윈도우의 좌표를 뷰 포트라 불리는 화면의 직사각형으로 변환하는 과정을 말한다. 게임에서의 뷰 포트는 직사각형의 전체 화면이 되지만, 윈도우 모드에서 실행하는 경우에는 클라이언트 영역이나 화면의 일부가 될 수도 있다.

 

9. 레스터라이즈

 스크린 좌표로 버텍스들이 변환한 다음에는 2D 삼각형들의 리스트를 가지게 된다. 레스터라이즈 단계는 각각의 삼각형을 그리는데 필요한 픽셀컬러들을 계산하는 과정이다.

 

 

▼ 기존 글

더보기

렌더링 파이프 라인 

- 가상으로 만든 3D 를 2D 화면에 뿌리기 까지의 과정

- 한번 정의하면 다시 정의 하기 전까지 그 값이 그대로 가며 , 아무것도 안해주면 디폴트값 , 버텍스 구조체의 rhw사용할경우가 디폴트. 

 

로컬 스페이스 -> 월드 스페이스 -> 뷰 스페이스 -> 후면 추려내기 -> 조명 -> 클리핑 -> 투영 ->뷰 포트 -> 래스터 라이즈

 * -> ??? ( 아니 이게 다 뭔 개소리지 ) -> 차차 알게됨


1. 로컬 스페이스

-  0,0,0 을 원점 기준으로 얼마나 떨어진 위치에 Vertex 가 있는지 나타낸 좌표 시스템 .

그냥 쉽게 그림 봐라

- 위 도형에서 각 축의 0,0,0 기준으로 각 점들이 떨어져 있는 위치를 적어줘야한다. 상대적인 크기라... 1 이든 100이든 큰 상관은 없지만.. * 절대 윈도우 좌표와 혼동되지 않도록 한다. 

 

2. 월드 스페이스  

- 위에서 만든 로컬 스페이스 좌표를 가진 하나의 도형(물체 뭐 그런거 )을 월드 좌표에 배치한다.

이때 물체의 이동이나 , 크기 변경 , 회전등의 연산을 한것이 월드 좌표가 되는데 , 이를 순서대로 나열한것이

스자이공부

 

Scaling - 크기 변경

 

Rotation X

Rotation Y   - 각 축 회전 , 자전을 의미

Rotation Z

 

Translation - 이동 ( 좌표 값으로 배치 )

 

Rotation - 공전 ( 다른 녀석을 기준으로 회전 )

 

Parent - 부모행렬 ( 만일 다른 사물에 종속되어있다면 , 그 사물이 움직일떄 동일한 연산을 한다 )

 

이걸 줄여서 SRTRP 라고 외우던가 스자이공부 (스케일링 자전 이동 공전 부모) 로 외우던가 알아서...

 



 D3DXMatrixScaling( &matScale , m_Info.vScale.x , m_Info.vScale.y , m_Info.vScale.z );
 D3DXMatrixRotationX( &matRotX , m_Info.vRot.x );
 D3DXMatrixRotationY( &matRotY , m_Info.vRot.y );
 D3DXMatrixRotationZ( &matRotZ , m_Info.vRot.z );
 D3DXMatrixTranslation( &matPos , m_Info.vPos.x , m_Info.vPos.y, m_Info.vPos.z );
 D3DXMatrixRotationAxis( &matRev , &m_Info.vRev ,  m_Info.fRev );



 m_matWorld = matRotX* matRotY * matRotZ * matPos * matRev * (*m_Info.pParent );
 matWorld   = matScale * m_matWorld;



 m_pd3dDevice->SetTransform( D3DTS_WORLD , &matWorld );  //월드 좌표로 셋업

 

cf. 자식한테 물려줄때는 스케일링은 포함시키지 않는다.

 

 

3. 뷰 스페이스  

카메라 ( 우리가 보는 시점 ) 에 관한 전반적인 설정을 하는데 . 사실은 카메라를 원점기준으로 맞춰주면서 월드 좌표에 있는 사물을 그에 맞게 이동하는 모든 작업을 하는것이다. 이해가 되지 않으면 카메라의 위치나 보는 방법등을 결정한다고 생각하자.

 

 //카메라  카메라 위치 , 카메라가 보는 점 , 카메라의 회전    정의 

 D3DXMATRIXA16 matView;
 D3DXVECTOR3  vEye(0,40,-35);
 D3DXVECTOR3  vLook(0,0,0);
 D3DXVECTOR3  vUpVec(0,1,0);
 


 D3DXMatrixLookAtLH( &matView , &vEye , &vLook , &vUpVec );


 m_pd3dDevice->SetTransform( D3DTS_VIEW , &matView );


 

 

 

4. 후면 추려내기 ( 컬링 )   

- 컬링 ? : 내 시점에서 보이지 않는  뒷'면' 을 출력하지 않는것

- 하지만 가끔은 뒷면을 출력해야하는 경우도 있다 ( 상자 속 이라던가...  )

 

컬링 모드를D3DCULL_CCW 로 설정하면 , 반시계 반향 순서로 이루어진 도형이 보이지 않는다. 

 



//컬링 모드
 m_pd3dDevice->SetRenderState( D3DRS_CULLMODE , D3DCULL_NONE );


 

 

 

5. 조명

- 말 그대로 조명에 관한것을 설정해준다.

- 조명을 하기전에 우선 빛은 3가지로 나누어 진다.

 

- Ambient     환경광 

  다른 표면에 반사 되어서 비추는 전반적인 빛 

 

- Diffuse    난반사광

  특정한 방향으로 진행하며 , 모든 방향으로 동일하게 반사되는 빛 ( 말이 어렵지만 , 그냥 일반적인 빛의 색이라 생각해 )

 

- Specular 정반사광

  특정 방향으로 강하게 반사되는 빛으로 , 특정 각도에서만 보이는 빛 . 빛이 사물에 비출때의 하이라이트 부분의 그 빛임.

 

광원도 3가지로 나누어 지고 , 상황에 따른 사용이 다르다.

 

- Point Light
점에서 빛이 뻗어 나감 
위치가 중요 , 방향은 무쓸모.
피사체와 거리가 가까운 실내에 쓰인다.

 

- Directional Light
일정 방향으로 빛 ㄱㄱ 햇빛같은거야
위치는 없어도 되 , 방향은 반드시 있어야해 
피사체와 먼 실외에서 이걸 써라.

 

- Spot Light
손전등 처럼 빛이 나가.

GPU연산을 해야 효율적이고 빠르고 간지가 나기 떄문에

여기서는 사용을 잘 안한다.

 

== 렌더

순서

- 라이트 구조체 선언 및 설정

- 라이트 스위치중에 하나로 스위치 저장

- 라이트 스위치 켜기

- 라이트닝 렌더 사용 설정

 

 void  CMainGame::SetLight()
{

             // 포인트 라이트의 예시
             D3DLIGHT9 light;
             memset(&light , 0 , sizeof(D3DLIGHT9) );
             light.Type  = D3DLIGHT_POINT;
             light.Diffuse.r = 1.0f;
             light.Diffuse.g = 1.0f;
             light.Diffuse.b = 1.0f;
             light.Position.x= 0;
             light.Position.y= 0;
             light.Position.z= 0;
             light.Range  = 1000.0f;



             m_pd3dDevice->SetLight( 0 , &light ); //0번째 스위치에 저장
             m_pd3dDevice->LightEnable( 0 , TRUE); //0번째 스위치 온
             m_pd3dDevice->SetRenderState( D3DRS_LIGHTING , TRUE); //라이팅 렌더 온



             //환경광 Ambient 설정
             m_pd3dDevice->SetRenderState( D3DRS_AMBIENT , 0x00202020 );

}

 

- 만일 Directional Light 를 사용할것이면  Position 은 무시하고  Direction 을 설정해준다. ( 방향 )

 

 

 

6. 클리핑

- 클리핑 : 뷰 스페이스 안에 들어오지 않는 ( 카메라 시야각 ) 오브젝트 등 뿌려줘야 할 물체는 뿌려주지 않는 것.

디폴트 값으로 사용 하면 된다.

 

 

7. 투영

- n차원에서 n-1 차원을 얻는 작업 ( 뭔 개소리야 , 그냥 3차원을 -> 2차원 화면에 이동하는 작업 . 4차원 쓸꺼 아니자나..)

- 우리는 각 사물의 깊이에 따른 크기를 화면에 적용시키는 원근 투영 을 사용할것이다.  

- 투영 행렬을 거치면  모든 월드 좌표는 -1 과 1 사이의 값을 가지게 된다.

x , y =  -1 ~ 1
z     =    0 ~ 1

이는 Clear 함수 호출시 매개변수로 1.0f를 넣어주는 부분이 depth가 최대 1이기 때문이다.

 

 

- 순서

- 행렬 선언

- 투영 함수 설정

- 투영 적용

 //투영
 D3DXMATRIXA16 matProj;
 D3DXMatrixPerspectiveFovLH( &matProj ,D3DX_PI/4,  (float)WINSIZE_X / (float)WINSIZE_Y , 1.0f , 100.f );
 m_pd3dDevice->SetTransform( D3DTS_PROJECTION , &matProj );

 

D3DXMatrixPerspectiveFovLH

( D3DXMATRIX* pOut ,  //  투영 행렬 리턴

  FLOAT fovY,             //   시야각 ( 내 시야의 범위 ) 

  FLOAT Aspect,         //   종횡비 ( 너비/높이) 비율

  FLOAT zn,               //   가까운 평면까지의 거리

  FLOAT zf                 //   먼 평면 까지의 거리

);

 

8. 뷰 포트 

  - 뷰 포트 ? : 프로젝트 윈도우 좌표(월드상 바뀐 좌표)를 화면 좌표로 바꾸어 주는 역활 .

뷰 포트는 내부적으로 알아서 잘 해주므로 신경 쓰지마요

 

 

9 래스터 라이즈 

- 삼각형을 기준으로 출력할떄 , 그릴때 필요한 픽셀을 계산하는 과정 .

래스터 라이즈는 엄청난 양의 작업을 요구하므로 , 반드시 그래픽 카드에서 처리해줘야 한다.

이 결과물은 모니터에 바로 디스플레이 될수있는 2d 이미지가 된다.

 

 

 

 

 

 

 

 

 

중첩 클래스

class 내부에 class를 선언하는 것이다

 

보통, 외부 class에 내부 class를 선언하는 경우에 / 내부 class를 private 으로 정의한다.

왜냐하면, 특정 클래스 안에서만 사용하는, 또다른 클래스 자료형이 필요할 경우에 이러한 방식을 사용하기 때문이다.

 

 

 

 

 

https://m.blog.naver.com/PostView.nhn?blogId=kks227&logNo=220179773371&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

'Language > C++' 카테고리의 다른 글

C++ for_each 함수  (0) 2018.03.21
wsprintf 정리  (0) 2018.02.28
문자열 코딩 - [아스키코드, 멀티바이트, 유니코드]  (0) 2018.01.10
[C++] variadic template  (0) 2017.12.28
[C++] 템플릿 이것저것(정리중...)  (0) 2017.12.27

 

 

VS 프로젝트 속성 -> 구성속성을 보면

문자 집합으로 2가지를 사용할 수 있다.

1. 멀티바이트 문자 집합

2. 유니코드 문자 집합

 

 

아스키 코드(SBCS) - 모든 문자 하나가 1byte를 차지하며 영어를 표현한다. 

하지만 아스키 문자 코드 만으로는 한글이나 일어 등의 다른 문자를 표시할 수 없다.

 

 

 

멀티바이트(MBCS) - 1. 아스키 문자 코드에다가 다른문자(2byte)들을 포함한 문자 집합이다.

어떤 문자는 1byte고, 어떤 문자는 2byte이다.

정확히는 모르겠지만, 한 문자가 2byte를 넘는 문자도 존재할 것이다.

 

2. 멀티바이트 문자 집합은 특정 문자 집합마다의 코드페이지가 존재한다.

예를 들어, 같은 코드 번호 일지라도 한글 코드 페이지로 해석하면 한글이 나오지만,

일어 코드 페이지로 해석하면 일어가 나온다.

그래서 이상하게 깨지는 문자 등을 우리는 목격할 수 있다.

 

 

 

 

 

유니코드(WBCS) - 멀티바이트 2번의 방안으로 탄생한 것이다!

 아스키 문자 코드 뿐만 아니라, 한글, 일어 등등 어떠한 문자들을 총 망라하여

 각 한 문자에 2byte씩으로 할당하여 만든 문자 집합.

 그리하여 각각의 특정 문자는 고유의 유니코드값을 가진다.

 

 

 

 

 

 

코딩 시에는 !! 

게임이 여러 언어를 지원해야할 경우가 있을 시에, 소스 상에서 유연성이 필요하다!!

 

먼저, 기본적인 습관을 고치도록 하자.

 

 char  TCHAR 
 strcat_s( )  _tcscat_s( )
 strcpy_s( )  _tcscpy_s( ), _tcsncpy_s( )
 strlen( )  _tcslen( )
 sprintf_s( )  _stprintf_s( )

 

그리고 문자열을 바로 쓸 때,

"" 대신에 TEXT(" ")를 쓰자.

 

TEXT 매크로는 유니코드의 설정에 따라 상수의 타입을 달리 한다.

 

예를 들어, 유니코드로 컴파일 할 경우, 

TEST("a")를 16bit(2byte) 문자로 인식하고,

아닐 경우,

8bit(1byte) 아스키 문자로 인식한다.

 

 

 

 

 

 

 

문자열을 처리하는 기본 자료형은 보통 

char / wchar / TCHAR     사용한다.

 

아스키코드 char - 영어를 표현하며 모든 문자를 1byte로 구성한다.

 

유니코드 wchar - 모든 문자를 2byte로 구성한다.

( 영어는 1byte로 되어있으나, 한글을 포함한 다양한 나라의 독특한 언어 표현을 위해 최소 2byte가 필요한데,

멀티바이트를 사용하기도 하지만, 1byte와 2byte로 메모리 관리가 어려워진다.

그래서 사용하는 것이 wchar)

 

더보기

 

wchar_t : C++ 표준에 의해 정의된 구별 유형

wchar   : 비표준이며, 아마도 Windows에서만 존재.
            wchar_t 를 typedef를 통해 자료형이나 매크로로 사용하는 경우도 있어서

실제적인 차이는 없음.

 

결론 : wchar 쓰지말고 wchar_t 써라는 뜻
출처:https://code.i-harness.com/ko-kr/q/892af

 

TCHAR - 아스키 타입의 일반 char 또는 유니코드 타입의 wchar 이라는 의미이다.

 

TCHAR을 사용하면, char인지, wchar인지 구별하지 않고 그냥 코딩할 수 있게 된다.

컴파일러에 유니코드라고 알려주지 않으면 char 로 동작한다.

만약, 나중에 wchar로 사용하려면 컴파일러에 유니코드라고 알려주면 되고, 소스코드는 손대지 않아도 된다.

 

 

TCHAR 은 char 인지, wchar 인지 구별하지 않고 코딩할 수 있게끔 해주기 위해 존재한다.

 

TCHAR 이 어떤건지에 대한 구별은 유니코드라는 precompile 상수를 이용해서 구분하며,

이는 프로젝트 -> 셋팅 에서 _DEBUG 등등이 선언되어 있는 곳 끝에 선언해주면 

TCHAR 은 wchar 로 변환해서 컴파일을 시도한다.

 

 

글로벌한 제품 개발을 위해서는 TCHAR 사용이 필수인듯 하다.

 

 

+

cf.   UTF-8 ㅇㅣ게 뭔지 체크..

 

 

 

char - string / strcpy( (char), (string).c_str() );    / "세턴"

TCHAR - wstring / lstrcpy( (TCHAR), (wstring).c_str() );    / L"세턴"

 

 

 

 

 

 

https://blog.naver.com/wondo21c/30043174174

http://klkl0.tistory.com/87

http://blog.neonkid.xyz/86

위키백과

 

 

 

 

 

'Language > C++' 카테고리의 다른 글

wsprintf 정리  (0) 2018.02.28
[C++] 중첩 클래스 사용 이유  (0) 2018.01.10
[C++] variadic template  (0) 2017.12.28
[C++] 템플릿 이것저것(정리중...)  (0) 2017.12.27
[C] 디버깅 중 출력화면에 변수 출력하기  (0) 2015.09.25

 





variadic template 은...


템플릿의 인자를 가변적으로 받을 수 있도록 구현하는 방식이다





참고)

variable argument (다양한 인수의 표현) 이것의 심볼로는 ... 을 사용합니다.



variadic template을 함수 템플릿 / 클래스 템플릿 2가지로 나누어서 간략히 설명합니다.















 

 



 

템플릿 메타 프로그래밍

 

일반 함수를 써서 재귀호출을 해야하는 문제를, 템플릿 클래스를 이용하면 똑같이 구현할 수 있다.

▶ 템플릿의 원래 기능이 아니라, 템플릿을 이용해서 문제를 푸는 방법

 

cf. 재귀 호출 방식으로 템플릿을 계속 생성하는 것은, 잘 알려진 대표 템플릿 메타 프로그래밍의 예

 

 

 

 

 

템플릿 메서드 패턴

 

부모 클래스에서 virtual이 아닌 함수 내부에서, 자식의 virtual 함수를 호출한다

 

자식의 virtual 함수를 호출 : 객체 생성 타입에 따라 적절한 오버라이딩 호출

 

 

 

 

 

템플릿 트릭

 

템플릿 트릭 중 하나가

 

템플릿 메소드 패턴을 사용하면 virtual 함수를 런타임 때 테이블로 접근해서 호출하는데

 

이러한 테이블을 접근하는 시간을 단축하기 위해 해결하는 static polymorphism 방법임 ( 템플릿 04 강의 )

 

 

 

 

 

 

템플릿 메서드 패턴의 템플릿은 C++템플릿이 아니다.. 그냥 "" 이라는 의미다.

c++템플릿의 기능을 사용하는 것이 아니라, 적절한 오버라이딩을 호출하도록 하는 거니까...ㅎㅎ