장렬히 떠나신 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]);
...과 같은 코드가 멀쩡하게 동작합니다. 이쯤되면 이게 템플릿인가 헷갈릴정도
다만 parr의 경우 여러분 컴퓨터가 감당하지 못할 것 같군요.
Deduction Guide 에 대해선 아래 링크를 참고하세요.
[C++17] 템플릿 인자를 생략한다? Deduction Guide
1부터 10까지 저장하는 배열을 하나 생성해보죠. int nArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 아니면 간단히 int arr[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // C++11에는 중괄호를 두 번씩 써야 함: {{1..
karupro.tistory.com
'C++ > C++ 심화 강좌' 카테고리의 다른 글
[C++11/17 심화 강좌] 스마트 포인터로 배열 동적할당하기 (0) | 2022.02.16 |
---|---|
[C++ 심화 강좌] C++20 <=> Three-way 비교 연산자 (0) | 2021.09.22 |