반응형

템플릿 파라미터의 지원 종류

타입(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<>을 사용해야함
}
반응형

+ Recent posts