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
728x90
반응형