728x90
반응형
Study about template
- 뭔가를 찍어내는 틀이라 생각
- 생산성이 향상됨
template 종류
- function template
- class template
class template 예제
template<typename T>
class Test
{
public:
Test()
{
m_Data = 0;
}
~Test() {}
void SetData(const T& t)
{
this->m_Data = t;
}
T GetData()
{
return this->m_Data;
}
T operator+ (const T& t)
{
return (this->m_Data + t);
}
private:
T m_Data;
};
int main(void)
{
Test<int> a;
a.operator+(6);
std::cout<<a.GetData()<<std::endl;
return 0;
}
- 연산자 다중정의때도 유용하게 사용
클래스 template 특수화 (코드예제)
template<typename T>
class MyData { };
// char* 예외 특수화
template<>
class MyData<char*> { };
- 클래스 템플릿특수화 template<비우기> 다음 class명 옆에 예외처리할 타입 넣기
함수 template 특수화 (코드예제)
template<typename T>
T Add(const T& a, cont T& b) { return (a+b); }
// 특수화 template
template<>
char* Add_char(char* left, char* right)
{
int nLeft = strlen(left);
int nRight = strlen(right);
char *result = new char[nLeft+nRight+1];
strcpy_s(result, nLeft+1, left);
strcpy_s(result+nLeft, nRight+1, right);
return result;
}
int main(void)
{
int i_Result = Add<int>(3,4);
std::cout << i_Result << std::endl;
char *c_Result = Add_char<char*>("Hello", "world");
std::cout << c_Result << std::endl;
delete c_Result;
return 0;
}
- Add에서 int int / double double 등의 기본자료형 연산을 수행하려다 갑자기 char*등의 형이 올경우 불가능하다
- 이런 예외를 다르게 처리하기위해 특수화를 하는게 template 특수화
- 특수화시 template<비우기>
smart pointer (템플릿을 이용한 가장 좋은 코드중 하나)
- '포인터'와 관련해 Leak / 메모리동적할당(해제) / shallow copy Vs deep copy / 최적화 등 엄청 많은 문제들이 나오는 이를 해결하고자 등장
smart pointer 종류
- auto_ptr
- shared_ptr:
- unique_ptr:
- weak_ptr: 권장하지 않음
auto_ptr story
- "포인터 + 메모리관리 자동화"로 할당만 신경쓰면 해제는 자동화
- 배열로 할당시 배열로 해제가안됨 즉 delete[] 가 아닌 delete로 실행되어 하나만 소멸됨
- 하나의 객체 A 를 auto_ptr1과 auto_ptr2 두 개가 가르키는 shallow copy 수행시 auto_ptr1에서 객체도 소멸시키는데 auto_ptr2는 그걸 모르고 접근하기에 메모리 오류가생김
shared_ptr story (권장사용)
- auto_ptr의 shallow copy시 발생하는 문제 해결을위해 등장
- 참조개수 (포인팅 횟수)가 중요한 개념
- 객체에 대해 포인팅하는 포인터가 증가하면 count값도 증가하고 하나소멸하면 count값도 하나 감소하여 count가 0이되어야 대상을 소멸
- 대상을 배열로 지워야하는 경우는 로직을 따로 등록해야함
unique_ptr (필요할때 사용)
- shared_ptr하고 달리 한 대상을 오로지 한개의 포인터로만 포인팅 가능
- 여러개로 포인팅시 compile time에 에러발생
- shallow copy를 문법으로 차단하자는 의미 (compile time 에러를 통해 컴파일러가 얕은복사를 했다는것을 알려줌)
weak_ptr
- shared_ptr이 가리키는 대상을 참조형식으로 pointing 가능
- counter(포인팅 횟수)에 영향을 주지 않음
728x90
반응형
'C++ 공부' 카테고리의 다른 글
lambda (0) | 2021.08.22 |
---|---|
exception (0) | 2021.08.22 |
relational (0) | 2021.08.20 |
inheritance 04 (0) | 2021.08.20 |
inheritance 03 (0) | 2021.08.20 |