TIL/TIS 211206-211207

gyeon·2021년 12월 7일
0

TIL/TIS

목록 보기
13/14

TIL

탬플릿

클래스를 작성하다보면 클래스나 맴버함수에 정해진 함수형이 아니라 그때 그때 다른 자료형이 사용되는 경우가 있다.
예를들면 stack같은걸 자료구조를 구현하는 경우 필요할때마다 int, string, bool...등등을 담고싶을것이다. 기존 자료형으로만 작성한다면 그때마다 해당 자료형의 stack을 만들거나 override를 해주어야하는데, 이를 해결하는것이 탬플릿(template)이다.
탬플릿을 사용하는 클래스에 프로그래머가 인자로 타입을 넣어주면, 그 타입에 맞춰서 클래스의 탬플릿 형들이 치환된다.

#include <iostream>

template<typename T>	// 이거 밑에 오는 클래스는 Test3<T>일때 호출
class Test1 {
	public:
	Test1() {
		std::cout << "<typename T>" << std::endl;
	}
};

class Test2 {
	//T* t; -> 식별자 "T"이(가) 정의되어 있지 않습니다.C/C++(20)
	// 탬플릿 변수를 사용할때마다 template<...>로 명시해줘야 한다.
};

template<typename T1, typename T2>	// 이거 밑에 오는 클래스는 Test3<T1, T2>일때 호출
class Test3 {
	public:
	Test3() {
		std::cout << "<typename T1, typename T2>" << std::endl;
	}	
};

template<typename T1>	// 이거 밑에 오는 클래스는 Test3<T1, [...]>일때 호출
class Test3<T1, int> {	// Test3<T1, int>로 한정 -> 탬플릿 특수화
	public:
	Test3() {
		std::cout << "<typename T1, int>" << std::endl;
	}	
};

template<typename T1, typename T2>	// 이거 밑에 오는 클래스는 Test3<T1, T2>일때 호출
class Test3<T1,T2*> {
	public:
	Test3() {
		std::cout << "<typename T1, typename T2*>" << std::endl;
	}	
};

/* template<typename T1>	// 이거 밑에 오는 클래스는 Test3<T1, [...]>일때 호출
** class Test3<T1> { <- 클래스 템플릿 "Test3"에 대한 인수가 너무 적습니다.C/C++(442)
** 	public:
** 	Test3() {
** 		std::cout << "<typename T1, typename T2*>" << std::endl;
** 	}	
** };
*/

int main() {
	Test1<int> t1;
	Test3<int, int> t3;
	Test3<int, char> t3_1;
	Test3<int, int*> t3_2;
}

함수 탬플릿 / 탬플릿 인자

  • 함수탬플릿
    함수별로 탬플릿을 적용하여 사용할수도 있다. 이때 함수에 적용하는 경우 탬플릿 인수를 별도로 입력하지 않아도 된다.
  • 탬플릿 인자
    탬플릿으로 자료형만 받을수 있는게 아니라, 특정값(인자)를 받을수도 있다. 다만, 인자의 자료형은 정수형, 포인터, enum, 널포인터로 제한된다.
#include <iostream>

class Test {
	public :
	template <typename T>
	void test_func1(T t1, T t2) {
		std::cout << t1 << ", " << t2 << std::endl;
	}
	template <typename T, int t2>
	void test_func2(T t1) {
		std::cout << t1 << ", " << t2 << std::endl;
	}
};

int main() {
	Test t;
	// 탬플릿 인수(<...>)를 명시해야 했던 클래스와 달리,
	// 탬플릿 함수에서는 컴파일러가 자동으로 변환을 해준다.
	// t.test_func1(4, 2); -> t.test_func1<int>(4, 2);
	t.test_func1(4, 2);
	t.test_func2<int, 2>(4);
}

TIS

vscode 한글 입력 문제

mac에서 vscode를 쓰다, 한글 입력이 씹이는 경우가 많아질때
-> vscode의 표시언어구성을 ko로 변경

profile
백엔드와 서버 in 42Seoul

0개의 댓글