일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ChatGPT
- Machine Learning
- 오블완
- gpt
- 머신러닝
- deep learning
- 딥러닝
- Classification
- LG
- regression
- PCA
- OpenAI
- GPT-4
- 해커톤
- supervised learning
- LG Aimers
- 티스토리챌린지
- 지도학습
- LG Aimers 4th
- 분류
- 회귀
- AI
- LLM
Archives
- Today
- Total
SYDev
C++ Chapter 14-4 : 템플릿과 static 본문
함수 템플릿과 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
'Programming Lang > C++' 카테고리의 다른 글
C++ Chapter 15-2 : C++의 예외처리 메커니즘 (0) | 2023.08.01 |
---|---|
C++ Chapter 15-1 : 예외상황과 예외처리의 이해 (0) | 2023.08.01 |
C++ Chapter 14-3 : 템플릿 인자 (0) | 2023.07.31 |
C++ Chapter 14-2 : 클래스 템플릿의 특수화(Class Template Specialization) (0) | 2023.07.31 |
C++ Chapter 14-1 : Chapter 13 내용의 확장 (0) | 2023.07.31 |