leesangwon0114

I am Research Engineer. Currently working in KT.

C++Template 9. template parameter

12 Aug 2018 » c++

codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.

template parameter

template 이 받을 수 있는 것

  1. type
  2. 값 (non - type)
  3. template

template<typename T, int N> struct Stack
{
	T buff[N];
};

int main()
{
	Stack<int, 10> s;
}

type을 인자로 받는 경우
// type parameter
template<typename T> struct List
{
};

int main()
{
	list<int> s1;
}

non-type(값)을 인자로 받는 경우
// 1. 정수형 상수(실수 안됨.)
template<int N> struct Test1
{
};

// 2. enum 상수
enum Color { red = 1, green = 2 };
template<Color> class Test2 {};

// 3. 포인터 : 지역변수 주소 안됨... 전역변수 주소는 가능..
//			   no linkage 를 가지는 변수 주소는 안됨..
template<int*> class Test3{};

int x = 0;

// 4. 함수 포인터..
template<int(*)(void)> class Test4{};

int main()
{
	int n = 10;

	Test1<10> t1; // ok
	// Test1<n> t2; // error. 변수 안됨.

	Test2<red> t3; // ok

	// Test3<&n> t4; // ? 템플릿 인자는 컴파일타임에 인자가 결정되어야 함 -> error

	Test3<&x> t5; // ok

	Test4<&main> t6; // ok
}

정수형 상수, enum 상수, 포인터, 함수 포인터, 멤버 함수 포인터.

C++ 17: auto

template<auto N> struct Test
{
	Test()
	{
		cout << typeid(N).name() << endl;
	}
};

int x = 0;

int main()
{
	Test<10> t1; // N: int 의 값
	Test<&x> t2; // N: int* 의 값.
	Test<&main> t3;
}

Alt text

template을 인자로 받는 경우
template<typename T> class list {};

template<typename T, template<typename> class C> class stack
{
	// C c; // C는 틀이므로 error, list c 와 같은 코드
	C<T> c; // ok.. list<int> c
};

int main()
{
	list s1; // error. list 는 타입은 아니고 템플릿
	list<int> s2; // ok. list<int> 는 타입.

	stack<int, list> s3; // ok.
}

template default parameter
template<typename T = int, int N = 10> struct Stack {};


int main()
{
	Stack<int, 10> s1;
	Stack<int> s2;

	Stack<> s3; // 모든 인자를 디폴트 값 사용
}

template 파라미터의 종류 정리
  1. type
  2. 값(non-type) : 정수형 상수, enum 상수, 포인터, 함수 포인터, C++17 auto
  3. template

cf) default 값 사용 가능

C++ 11: 가변인자 템플릿(뒤에 깊이 다룸)

template<typename ... T> class Test{};
template<int ... N> class Test{};