Loading...

템플릿 인자와 템플릿 파라미터

argument 와 parameta... 코드는 "인자를 전달하여 파라미터로 만든다." 떄로는 인자를 실제 파라미터, 파라미터를 형식적 파라미터라고 부르기도 한다. template class ArrayInClass{ public : T array[N]; }; int main() { ArrayInClass ad; } - 템플릿 파라미터는 템플릿 선언이나 정의에서 키워드 template 다음에 나열된 이름들이다. 위의 예에서는 T와 N이 된다. - 템플릿 인자는 템플릿 파라미터의 자리에 대신 들어갈 아이템이다. 위의 예에서는 double와 10이다. 기본적으로 모든 템플릿 인자는 컴파일시에 결정될 수 있는 양이나 값이어야 한다. 템플릿 파라미터는 컴파일할 때 결국 값으로 치환되므로 이들은 컴파일 시 표현식을..

인스턴스화와 특수화

템플릿에서 인자를 실제 값으로 치환해 템플릿을 일반 클래스, 함수나 멤버 함수로 생성하는 과정을 템플릿 인스턴스화 라고 한다. 그 결과 생성된 실체(클래스, 함수 또는 멤버함수)를 일반적으로 특수화 라고 한다. 하지만 인스턴스화만이 특수화를 하는 유일한 방법은 아니다. 템플릿 파라미터를 특별히 치환해 명시적 특수화를 선언하는 방법도 있고, 부분적으로만 특수화 한 부분특수화도 있다. tempate // 일반 클래스 템플릿 class MyClass { .. } template // 명시적 특수화 class MyClass { .. } template // 부분 특수화 class MyClass { .. } template // 부분 특수화 class MyClass { .. }

함수 템플릿에 문자열 리터럴을 인자로 사용.

함수템플릿의 레퍼런스 파라미터로 문자열을 전달할경우 일어날수 있는 일들. template inline T const & max( T const & a, T const & b ) { return a [ 1> T=const char [5] 1> ] 머야.이건...ㅡㅡ;...무서워.. 참조자로 받지 않으면 어떻게 되니?? t..

템플릿 템플릿 파라미터

템플리의 파라미터로 템플릿을 사용하는 것을 말한다. 이를 사용하는 이유는 요소의 데이터형에 대해 다시 명시해 주지 않아도 컨테이너형을 명시할 수 있는 템플릿을 선언할 수 있다는 점이다. ex) Stack vStack; Stack > vStack; 첫번째 줄의 샘플을 보면 내부 컨테이너형을 명시하기 위해 컨테이너형과 함께 요소의 데이터형도 다시 넘겨준다. 하지만 템플릿 템플릿 파라미터를 사용하면 두번째줄의 예와 같이 요소의 데이터형에 대해 다시 명시해주지 않아도 된다. template // 템플릿 템플릿 파라미터, class 키워드사용해야함. class Stack { private: CONT elems; // elements public: void push(T const&); // push element ..

데이터형이 아닌 클래스 템플릿 파라미터

인자로 넘겨받는 것이 반드시 데이터형일 필요는 없다. 아래와 같이 일반적인 값을 입력받아도 되고, 이전글처럼 디폴트값도 지정해 줄 수 있다. // 스택크기를 사용자로부터 입력받는다. template class Stack 클래스 템플릿 뿐 아니라 함수 템플릿에서도 사용이 가능하다 template T addValue(T const& elem) { return elem + VAL; } 이런 종류의 함수는 파라미터로서 많이 사용된다. std::transform(soruce.begin(), source.end(), dest.begin(), addValue); 함수템플릿 인스턴스는 오버로딩 함수들의 집합에 대한 이름일 뿐이며 현재표준에 따르면 오버로딩함수들의 집합은 템플릿 파라미터추론에 사용될 수 없다. 따라서 함..

기본 템플릿 인자

함수에서 기본인자값을 정해주는것과 비슷하게 템플릿의 데이터형도 디폴트로 미리 정의해 줄 수 있다. 이를 기본 템플릿 인자라고 한다. 그리고 언제나 ">"을 쓸때는 ">>" 을 주의해야 한다. 괄호가 두개 겹쳐있는것이 잘못하여 시프트연산자로 인식될 수도 있기 때문이다. #include #include template class Stack { private: CONT vecElem; public: void push(T const&); void pop(); T top() const; bool empty() const { return vecElem.empty(); } }; // 두개의 템플릿 파라미터를 가지므로 멤버함수정의시 모두 명시 template void Stack::push(T const& elem) {..

클래스 템플릿 특수화

클래스 템플릿을 특정 템플릿 인자로 특수화 할 수 있다. 이전글의 함수템플릿 오버로딩처럼 클래스 템플릿을 특수화 하려면 특정 데이터형에 맞게 구현해서 특정 데이터형에서 클래스 템플릿이 인스턴스화됐을때 잘못 동작할 수 있는 부분을 수정할 수 있다. 클래스 템플릿을 특수화 할려면 모든 멤버함수를 특수화해야한다. stack1.hpp template class Stack 위와 같이 만들었던 stack1을 특수화해서 stack2.hpp를 만들면 아래와 같다. stack2.hpp #include "stack1.hpp" template class Stack 즉, 클래스 템플릿을 특수화할 경우에는 template을 먼저쓰고 클래스를 언언하고, 그 뒤에 어떤 데이터혀으로 클래스 템플릿을 특수화 할 것인지를 기술한다. t..

클래스 템플릿

#include #include template // 데이터형 파라미터로 사용할 식별자 class Stack { public: void push(T const&); void pop(); T top() const; bool empty() const { return data_.empty(); } private: std::vector data_; }; 클래스 템플릿 내부에서 다른 일반적인 데이터형처럼 T를 사용하여 멤버와 멤버함수를 선언할 수 있다. 이 클래스의 데이터형은 Stack이고 T는 템플릿 파라미터이다. 그러므로 선언에서 이 클래스의 데이터형을 써야 한다면 Stack로 표기해야 한다. ex ) 복사생성자나 할당연산자. Stack (Stack const&); 복사생성자 Stack& operator= (..