[CPP-07] Templates

이대현·2021년 5월 17일
0

C / CPP

목록 보기
27/28

ex00: A few functions

[과제 소개]

  • 다음 함수 템플릿을 작성하세요

    • void swap( , ) : 두 인자의 값을 스왑. 반환 X
    • int min( , ) : 두 인자를 비교해 더 작은 값을 반환. 같으면 두 번째 인자 반환.
    • int max( , ): 두 인자를 비교해 더 큰 값을 반환. 같으면 두 번째 인자 반환.
  • 템플릿은 반드시 .hpp에 정의하세요.

  • 위 함수들은 두 인수의 유형이 동일하고 모든 비교 연산자를 지원하는 조건 하에, 어떤 자료형의 인자랑도 호출 가능합니다.

  • main.cpp 내세요. 이 파일은 평가중에 수정될 수 있고, 수정될 것입니다.

  int main( void ) {
  
    int a = 2;
    int b = 3;
  
    ::swap( a, b );
    std::cout << "a = " << a << ", b = " << b << std::endl;
    std::cout << "min( a, b ) = " << ::min( a, b ) << std::endl;
    std::cout << "max( a, b ) = " << ::max( a, b ) << std::endl;
   
    std::string c = "chaine1";
    std::string d = "chaine2";
  
    ::swap(c, d);
    std::cout << "c = " << c << ", d = " << d << std::endl;
    std::cout << "min( c, d ) = " << ::min( c, d ) << std::endl;
    std::cout << "max( c, d ) = " << ::max( c, d ) << std::endl;
  
    return 0;
  }
// output

a = 3, b = 2
min(a, b) = 2
max(a, b) = 3
c = chaine2, d = chaine1
min(c, d) = chaine1
max(c, d) = chaine2

1.1 함수 템플릿 (function template)

템플릿(template): 템플릿이란 매개변수의 타입에 따라 함수나 클래스를 생성하는 메커니즘을 의미한다. 템플릿은 타입이 매개변수에 의해 표현되므로, 매개변수화 타입(parameterized type)이라고도 불린다.

함수 템플릿을 사용하면 서로 다른 타입에서 동작하는 함수를 한 번에 정의할 수 있다.

template <typename T>
void Swap(T& a, T& b)
{
    T temp;
    temp = a;
    a = b;
    b = temp;
}
template <typename T>
T& min(T& a, T& b)
{
	if (a < b)
		return a;
	else
		return b;
}



ex01: Iter

[과제 소개]

  • 함수 템플릿 Iter를 작성하세요.
  void iter(T *배열의주소, unsigned int 배열의길이, void(*f)(T &배열));
  • 세 번째 매개 변수는 배열의 각 요소에서 호출되는 함수

  • 함수 템플릿 iter가 어느 타입의 배열이랑도 잘 작동함을 증명하세요.

  • 인스턴스화된 함수 템플릿을 세번째 매개변수로 받을 때도 잘 작동함을 증명하세요.



ex02: Array

[과제 소개]

이 과제는 배열처럼 작동하는 클래스 템플릿을 작성해야한다. 실제 배열의 내부 할당이 new[]으로 사용되야한다. 복잡한 유형의 배열이 작동하는지 체크한다.

type T 요소를 포함한 클래스 템플릿 Array를 작성하세요.

  • 생성자(매개변수 없음): 빈 배열 생성

  • 생성자(unsigned int n): 배열[n] 생성, 디폴트로 초기화

    팁: int *a = new int();을 컴파일 하고 *a를 디스플레이 해보세요.

  • 복사생성자, 할당연산자오버로딩 : rhs, lhs 어느 쪽을 수정해도 나머지 한 쪽에 아무 영향도 끼치지 않게 하세요.

    -> (deep copy로 분리하기)

  • 할당시 반드시 new[] 연산을 써야합니다. 미리 정적 할당을 해서는 안 됩니다. 할당되지 않은 메모리에 액세스해서는 안 됩니다.

  • 연산자[] 오버로딩으로 배열의 요소들에 접근 가능해야 합니다.

    -> 연산자[]로 접근할 때, 만약 이 요소가 범위(limits)바깥일 경우 std::exceptionthrow.

  • 멤버함수 unsigned int size(void) : 배열 요소의 개수를 리턴하며, 현재 인스턴스를 수정하지 않습니다.


2.1. 클래스 템플릿

함수 템플릿이 기능만 정의되고 타입이 정의되지 않은 함수의 일반화였다. 클래스 템플릿(class template)도 마찬가지로 클래스의 일반화이다. 클래스 템플릿을 정의하면 타입에 따라 클래스를 생성할 수 있다.

클래스 템플릿은 무조건 템플릿 인수를 명시해 주어야 한다. 인스턴스를 생성하는 과정에 이유가 있는데, 생성자를 호출하기 전에 해당 객체에 대한 메모리를 미리 할당하기 때문이다. 따라서 명시적으로 템플릿 인수를 작성하지 않을 경우 객체를 생성할 수가 없는 것이다.

template<typename T>
class Test {
 private:
  	T value_;
 public:
  	Test(T value) : value_(value) {};
}

int main(void) {
  Test<int> t_int(42); // 템플릿 인수 명시
  Test<std::stding> t_string("hello"); // 템플릿 인수 명시
}

템플릿 - 클래스 템플릿(class template)

profile
삽질의 기록들 👨‍💻

0개의 댓글