Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 14-4 : 템플릿과 static 본문

Programming Lang/C++

C++ Chapter 14-4 : 템플릿과 static

시데브 2023. 7. 31. 18:11

함수 템플릿과 static 지역변수

  • static 지역변수는 템플릿 함수 별로 각각 존재한다.

 다음 예제를 통해서 이러한 사실을 확인해보자.

#include <iostream>
using namespace std;

template <class T>
void ShowStaticValue(void)
{
    static T num=0;
    num+=1;
    cout<<num<<" ";
}

int main(void)
{
    ShowStaticValue<int>();
    ShowStaticValue<int>();
    ShowStaticValue<int>();
    cout<<endl;
    ShowStaticValue<long>();
    ShowStaticValue<long>();
    ShowStaticValue<long>();
    cout<<endl;
    ShowStaticValue<double>();
    ShowStaticValue<double>();
    ShowStaticValue<double>();
    cout<<endl;

    return 0;
}
1 2 3 
1 2 3 
1 2 3

 

클래스 템플릿과 static 멤버변수

  • 함수 템플릿의 경우와 유사하게, static 멤버변수는 템플릿 클래스 별로 각각 존재한다.

 다음 예제를 통해 이런 사실을 확인해보자.

#include <iostream>
using namespace std;

template <class T>
class SimpleStaticMem
{
private:
    static T mem;
public:
    void AddMem(T num) { mem+=num; }
    void ShowMem() { cout<<mem<<endl; }
};

template <class T>
T SimpleStaticMem<T>::mem=0;    //static 멤버의 초기화 문장, static 멤버는 클래스 외부에서 초기화해야 함

int main(void)
{
    SimpleStaticMem<int> obj1;
    SimpleStaticMem<int> obj2;
    obj1.AddMem(2);
    obj2.AddMem(3);
    obj1.ShowMem();
    SimpleStaticMem<long> obj3;
    SimpleStaticMem<long> obj4;
    obj3.AddMem(100);
    obj4.ShowMem();

    return 0;
}
5
100

 SimpleStaticMem<int>끼리 공유하는 static 멤버는 연산에 의해 5가 되었고, SimpleStaticMem<long>의 static 멤버변수는  SimpleStaticMem<int>형 객체의 연산에 영향을 받지 않았다.

 

template<typename T>와 template<>

  • template <typename T>선언과 template<>선언이 필요한 상황은 템플릿 관련 정의에 T가 포함되냐 안 되냐에 따라 갈린다.

 다음과 같이 템플릿 정의에 T가 등장하는 상황에는 template <typename T> 선언이 필요하다.

template <typename T>
class SoSimple
{
public:
    T SimpleFunc(T num) { . . . . }
};

 다음과 같이 템플릿 정의에 T가 등장하지 않는 경우에는 template<>선언을 사용하면 된다.

template <>
class SoSimple<int>
{
public:
    int SimpleFunc(int num) { . . . . }
};

 

템플릿 static 멤버변수 초기화의 특수화

 위 예제에서 템플릿 static 멤버변수의 초기화문은 다음과 같았다.

template <typename T>
T SimpleStaticMem<T>::mem=0;

 때문에 모든 type의 템플릿 클래스에서 해당 static 멤버변수의 값은 0으로 초기화되었다. 

 

 여기서 템플릿 클래스의 type에 따라서 static 멤버변수의 값을 다르게 초기화하려면 다음과 같이 초기화문에 대해서 특수화를 진행시켜주면 된다.

template <>
long SimpleStaticMem<long>::mem=0;

 위의 결과로 템플릿 클래스 SimpleStaticMem<long>의 static 멤버변수 mem은 다른 타입의 템플릿 클래스와 별개로 0으로 초기화되었다.

 


참고자료

  • 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12