클라이언트 코드가 Foo
(pimpl 관용구의 목적) 만 볼 수 있다면 구체적인 구현에서 특정 size_type
을 정의 할 필요가 없습니다. 어쨌든 클라이언트는 볼 수 없거나 액세스 할 수 없습니다. 표준 컨테이너는 런타임시 구현 숨기기 메소드를 사용하려고 시도하는 동안 소위 "컴파일 타임 다형성"으로 빌드되기 때문에이를 수행 할 수 있습니다.
상황에 따라 유일한 선택은 "가능한 모든 구현에 충분해야합니다"(예 : unsigned long
과 같은) 인 정수 유형을 선택하고 그대로 사용하는 것입니다.
uintptr_t
유형을 구현에 사용할 수있는 경우 (C99에서는 표준화되었지만 C++에서는 표준화되지 않음) 또 다른 가능성이 있습니다. 이 정수형은 프로그램에서 사용할 수있는 전체 저장소 주소 범위를 포함하므로 모든 메모리 내부 컨테이너의 크기를 나타내는 데 충분합니다. 다른 포스터에서는 종종 동일한 논리를 사용하지만 여기에서 사용할 적절한 유형은 size_t
이라는 결론에 도달하지 못합니다. 일반적으로 컨테이너는 물리적 어레이를 기반으로하는 경우 size_t
이 작동합니다. 그러나 컨테이너가 항상 배열 기반이 아닌 경우 size_t
의 범위는 일반적으로 비 연속 (배열 기반이 아닌) 컨테이너의 최대 크기보다 작기 때문에 여기에서 사용할 올바른 유형의 원격 유형이 아닙니다.
그러나 어떤 경우 든 표준 컨테이너에서 수행되는 것처럼 typedef 이름 뒤에 숨기는 것이 좋습니다.
출처
2010-02-01 16:38:43
AnT
합니다.두 번째 부분에서는 "구현 요소가 요소를 저장하는 데 사용되는 것이 알려지지 않았습니다"라고 말합니다. 그래서, 귀하의 컨테이너가 C++ - 배열 기반 구현으로 제한되어 있습니까? 실제 구현이 데이터를 저장하기 위해 목록이나 트리 (또는 다른 것)를 사용하는 것이 가능한가? 아니면 항상 물리적 배열로되어 있습니까? – AnT
@AndreyT : 구현은 C 배열, 고유 한 사용자 정의 배열, std :: vector 또는 무엇이든 원하는대로 사용할 수 있습니다. – Frank
@dehmann : 글쎄, 문제는 이것이 물리적 인 배열, 즉 연속적인 메모리 블록인지 아니면 개념적 배열 (예 : 연관 배열)인지에 관한 문제입니다. 예를 들어'std :: map' 컨테이너는 C++에서 연관 배열을 구현합니다. 귀하의 경우에 사용할 수 있습니까? 또한 연결 목록을 사용하여 개념 배열을 구현할 수도 있습니다 (비효율적 임에도 불구하고). 귀하의 경우 가능합니까? – AnT