codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.
template parameter
template 이 받을 수 있는 것
- type
- 값 (non - type)
- 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;
}
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 파라미터의 종류 정리
- type
- 값(non-type) : 정수형 상수, enum 상수, 포인터, 함수 포인터, C++17 auto
- template
cf) default 값 사용 가능
C++ 11: 가변인자 템플릿(뒤에 깊이 다룸)
template<typename ... T> class Test{};
template<int ... N> class Test{};