개요. C++ template

 

 

C++ template

 C++ 언어의 기본 요소.  

 클래스, 함수, 변수가 제네릭타입 (Generic Type)  으로 동작하게 하는것.

- 클래스 템플릿 : 클래의 멤버변수를 template 로 선언했다는 의미.

- 함수 템플릿 : 함수의 인자, 반환값을 template 으로 선언 했다는 의미.

- 변수 템플릿 : 변수를 template 로 선언했다는 의미.

 제네릭타입으로 선언된 것이 실제 사용될 자료형으로 되는것은 컴파일 시점에 이뤄진다. 즉, 컴파일러가 코드에서 사용된 특정 자료형별로 지가 알아서 추가 코드 작성해주는 것. 

 

유용성.

 자료형이 달라진 것은 추가 코드 작성하지 않아도 된다. 연산자오버로딩,다중상속시 간편하다.

 

추가정보.

1. 위키백과 : 템플릿(C++)



template 정의 구문의 typename , class 는 같은것.

template <typename T>, template <class T>  모두 같은 작용하는것. 


- 참고 : 동일 기능을 하는 것에 굳이 2개 용어가 할당되어 사용되는것은 C++ 규격은 한번 만들어지고 끝이 나는게 아니라 지속적으로 규격이 발전적으로 추가된다. 이 과정에서 과거 규격을 폐기할 수는 없다 보니 동일 기능인데 용어가 다른것이 등장하는것. 


 

 

 

 

 

변수 템플릿.

 

변수를 template 로 선언하는것.

 

참고.

C++14 에서 "변수 템플릿" 정의 되었음. 한편, Visual Studio 2015 VC++ 에서는 C++14 의 일부는 도입되어있으나 "변수템플릿"은 현재시점(2015년 12월26일) 지원되지 않음.

MS사의 관련 안내글.

"Visual Studio 2015에서 C++ 컴파일러 및 표준 라이브러리는 C++11에 대한 향상된 지원 기능과 특정 C++14 기능에 대한 초기 지원 기능으로 업데이트되었습니다. 또한 C++17 표준에 포함될 것으로 예상되는 특정 기능에 대한 예비 지원 기능도 포함하고 있습니다. "

 

 

 

 

 

 

함수 템플릿

 

함수 템플릿 선언, 정의 방법.

 

함수 선언예

template <typename T

T function(T a, T b, T c); // T를 일반자료형인것처럼 사용하면됨.

 

함수 정의예.

template <typename T 

T function(T a,T b, T c)

{

   T retv = a+b-c;

   return retv;

}

 

상기 템플릿인자로 정의된 함수 function  호출하는 예.

 

int  a=1,b=2,c=3,d;

d = function(a,b,c)

 

float a=1.0, b=2.0, c=3.0, d;

d = function(a,b,c)

 

double a=1.0,b=2.0, c=3.0,d;

d=function(a,b,c);

 

함수인자나 반환값이 달라도 동일함수이름인  function 을 호출할 수 있음이 함수 템플릿의 요점.

 

 

앞의 예에서는 함수의 인자 a, b, c모두 동일 T 로 선언했기때문에 호출시 a,b,c 는 동일 자료형으로 호출해야한다. 다른 자료형으로 호출하면 컴파일 에러 발생한다.


다른 자료형을 인자로 전달하려면 , 아래처럼 한다.

 

template <typename T1, typename T2,typename T3, typename T4>

T1 function(T2 a, T3 b, T4 c)

{

... 

}



 

 

 

 

 

클래스 템플릿

 



클래스의 멤버를 템플릿으로 선언하려면  멤버함수 단위로 템플릿 선언되지 않고, 클래스를 통째로 템플릿으로 선언해야 한다. 



클래스 템플릿 정의 방법.


 클래스 이름앞에 template <>  추가. 




//////////////////////////////////////////////////////////////////////////////////////////////////

예 : 클래스 템플릿 선언과 정의.


template <typename myT>

class myclass

{

public:

    myclass(int size);  // 생성자.

    ~myclass(){ delete[] p_myT ;}  // 소멸자.


    myT * p_myT; 

    void myfunc(myT args); // myT 사용된 함수템플릿 myfunc 선언. 


};


// 정의 코드들. - 상기 클래스 템플릿 코드 작성되어있는 동일 파일에서 작성해야함. 


emplate <typename myT>

myclass<myT>::myclass(int size) //생성자. 

{

   p_myT = new T[size]; // myT 의 1차원 배열 동적 생성 예임. 


}


//  myT 사용된 함수템플릿 yfunc 

template <typename myT>

void myclass<myT>::myfunc(myT args)

{

//   args 이용한 코드 작성.


}


//////////////////////////////////////////////////////////////////////////////////////////////////////

상기 클래스 활용예. - 상기 클래스 는 "1"개 코딩했는데, 활용에서는 자료형 여러개 들을 동일 클래스이용하여 활용가능함이 템플릿의 장점.


void main

{

   myclass<float> myclass_float(100)  ; //float 형 배열 사이즈 100 으로 하여 클래스 인스턴스 정적 생성. 


   myclass<int> myclass_int(100)  ; //int 형 배열 사이즈 100 으로 하여 클래스 인스턴스 정적 생성. 


   myclass<float> * p_myfloat = new myclass<float>(100); // float 형 배열 사이즈100 으로 하여 클래스 인스턴스 동적 생성. 


   myclass<int> * p_myint = new myclass<int>(100); // int 형 배열 사이즈100 으로 하여 클래스 인스턴스 동적 생성. 

   



   float args_float = 0.1;

   p_myfloat->myfunc(args_float);



   int args_int = 10;

   p_myint->myfunc(args_int);



}





 

 

 

 


템플릿의 정의(definition)  코드 작성은 헤더파일만 가능.


- 통상 일반 적인 코딩 방식에서는 .h 파일에는 선언(declaration)코드만 기록하고, .cpp 파일에는 정의(definition) 코드 작성하지만, 템플릿이 사용된 함수를 구현부에 코드 작성하면 컴파일 에러 생김. 


- 사유 : 템플릿은 컴파일 단계에서 실제 코드에서 호출된 자료형 에 해당하는 코드를 컴파일러가 추가로 만들어내는 개념이기 때문에 cpp 파일 구현코드가 기록되면 안됨. 


- 요점 : 템플릿 정의코드는 해당 템플릿 선언 있는 헤더파일에만 작성할것. 





 


첫 등록 : 2015.12.26 

최종 수정 : 2020.09.15

단축 주소 : https://igotit.tistory.com/523

 


 


 


Posted by 리치굿맨
TAG

댓글을 달아 주세요