memory_pointer_traits
memory_pointer_traits (std::pointer_traits)
<memory> 헤더에 정의되어 있어요. 포인터 같은 타입(fancy pointer, 예: boost::interprocess::offset_ptr)의 특정 속성에 표준화된 방식으로 접근하게 해주는 클래스 템플릿이에요. C++11부터 도입됐어요.
출처: cppreference
본문
template< class Ptr >
struct pointer_traits; // (1) since C++11
template< class T >
struct pointer_traits<T*>; // (2) since C++11
pointer_traits 클래스 템플릿은 포인터 같은 타입(fancy pointer)의 특정 속성에 표준화된 방식으로 접근하게 해줘요. 표준 템플릿 std::allocator_traits는 Allocator가 요구하는 다양한 typedef의 기본값을 결정하기 위해 pointer_traits에 의존해요.
-
- 특수화되지 않은 기본 템플릿은
Ptr::element_type,Ptr::difference_type,Ptr::rebind가 있으면 사용해요.
- 특수화되지 않은 기본 템플릿은
-
T*에 대한 특수화는element_type = T,difference_type = std::ptrdiff_t,rebind<U> = U*를 제공해요.
멤버 타입 (기본 템플릿)
| 타입 | 정의 |
|---|---|
pointer |
Ptr |
element_type |
Ptr::element_type (있으면), 아니면 Ptr이 원시 포인터면 그 대상 타입 |
difference_type |
Ptr::difference_type (있으면), 아니면 std::ptrdiff_t |
정적 멤버 함수
pointer_to(r):r을 참조하는pointer를 돌려줘요. 기본 템플릿에서는Ptr::pointer_to(r)이 있고, 원시 포인터 특수화에서는&r을 돌려줘요.to_address(p):p가 가리키는 원시 주소를 돌려주는element_type*(C++20).
using traits = std::pointer_traits<boost::interprocess::offset_ptr<int>>;
using elem = traits::element_type; // int
주의 (Notes)
pointer_traits는 fancy pointer가 원시 포인터처럼 다뤄지도록 하는 추상화 계층이에요. std::to_address(std::pointer_traits<Ptr>::to_address)는 fancy pointer를 원시 포인터로 평탄화할 때 쓰여요.