C++/C++ 심화 강좌

[C++17 심화 강좌] 스마트 포인터 편리하게 사용하기

카루-R 2022. 2. 16. 13:09
반응형

장렬히 떠나신 auto_ptr에 대한 내용은 기술하지 않겠습니다.

평소에 자주 쓰는 스마트 포인터는 shared_ptr, unique_ptr 이 둘뿐이라고 생각합니다.

shared_ptr<int> p(new int[10], [](int* p){ delete[] p; });

아마 배열을 쓰신다면 이렇게 쓰시겠죠. 그렇다고 함수객체를 쓰기엔 너무 복잡하니까.

하지만 C++17에선 타입을 T[]라고 쓰는 것만으로도 알아서 다~ 해제해줍니다.

shared_ptr<int[]> p(new int[10]);

하지만 shared_ptr은 tuple이나 array와 달리 Deduction Guide가 존재하지 않습니다.

(존재하긴 합니다. weak_ptr이나 unique_ptr일때만....)

그래서 제가 한번 만들어봤습니다.

template<typename T>
std::shared_ptr(T*) -> std::shared_ptr<T>; 

template<typename T, size_t N>
std::shared_ptr(T*[N]) -> std::shared_ptr<T[N]>;

template은 모든 타입들을 일반화시키려고 넣은것이고요,

만약에 필요 없다면 안써도 됩니다.

어쨌던, 둘째줄은 "shared_ptr의 생성자에 어떠한(타입이 T니까) 포인터 형식이 들어오면 -> 자동으로 타입을 shared_ptr<T>라고 추론한다" 정도로 생각할 수 있겠습니다.

만약 여러분이 만든 템플릿 컨테이너에 생성자가 const char* 값을 받았을 경우, std::string형으로 사용하려면

template<class T> Container(const char*) -> Container<std::string>;

이라고 하면 됩니다. 함수에는 적용되지 않습니다. 클래스만 가능합니다.

소괄호와 꺾쇠괄호도 잘 살펴주십시오.

어쨌든, 저 줄을 추가하게 되면

shared_ptr pint(new int);
shared_ptr parr(new int[298446579843135787343541654687431321654715347680]);
반응형