본문 바로가기
C++ 공부

template

by Dev_Hugh 2021. 8. 20.
728x90
반응형

Study about template

  • 뭔가를 찍어내는 틀이라 생각
  • 생산성이 향상됨

template 종류

  1. function template
  2. 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 종류

  1. auto_ptr
  2. shared_ptr:
  3. unique_ptr:
  4. 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