반응형
템플릿 파라미터의 지원 종류
타입(Type)
// 타입 파라미터
template<typename T>
class List
{
};
int main()
{
List<int> l1; // OK
}
값(Non-type)
- 정수형 상수
- 열거형 상수(Enum)
- 포인터
- 함수 포인터
- Auto(C++17)
#include <iostream>
using namespace std;
// 1. 정수형 상수(실수 안됨)
template<int N>
class Test1 {};
// 2. enum 상수
enum Color { red = 1, green = 2};
template<Color> class Test2 {};
// 3. 포인터 : 지역변수 주소안됨.. 전역변수주소는 가능..
// no linakge를 가지는 변수 주소는 안됨.
template<int*> class Test3 {};
// 4. 함수 포인터 :
template<int(*)(void)> class Test4 {};
// C++17에서는 auto 타입 사용가능
template<auto N> struct Test
{
Test()
{
cout << typeid(N).name() << endl;
}
};
int x = 0;
int main()
{
int n = 10;
// Non-type 파라미터
Test1<10> t1; // OK
//st1<n> t2; // Error(변수 안됨);
Test2<red> t3; // OK(enum)
//Test3<&n> t4; // Error(지역변수 주소 안됨)
Test3<&x> t5; // OK(전역 변수, Static 변수 주소 가능)
Test4<&main> t6; // OK(함수 포인터 가능)
// C++17 auto 지원
Test<10> a1;
Test<&x> a2;
Test<&main> a3;
}
템플릿(Template)
#include <iostream>
using namespace std;
template<typename T> class List{};
// 템플릿 파라미터(template parameter)
template<typename T, template<typename> class C> class Stack
{
//C c; // Error(C는 템플릿)
C<T> c; // OK(C<T> == list<int>)
};
int main()
{
//List s1; // Error(list는 타입이 아니고 템플릿)
List<int> s2; // OK(list<int>는 타입)
Stack<int, list> s3; // OK
}
파라미터 기본값 사용
- 함수 파라미터와 동일하게 기본값 지원
#include <iostream>
using namespace std;
// 기본값 파라미터(default parameter)
template<typename T = int, int N = 10> class Stack
{
};
int main()
{
Stack<int, 10> s1;
Stack<int> s2;
Stack<> s3; // 그냥 stack은 템플릿이므로 꼭 stack<>을 사용해야함
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 템플릿 특수화 예제(IfThenElse/IF/Select, conditional) (0) | 2021.01.03 |
---|---|
C++ 템플릿 특수화/부분 특수화(Template specialization) (0) | 2021.01.02 |
C++ 템플릿 template 키워드 (0) | 2021.01.01 |
C++ 템플릿 value_type (0) | 2021.01.01 |
c++ 템플릿 typename (0) | 2020.12.31 |