2011-01-27 6 views
5

표준 라이브러리 또는 부스트 내에 필수 typedef (size_type, value_type 등)를 사용하여 사용자 지정 STL 호환 시퀀스를 채우기위한 일종의 유틸리티 기본 클래스가 있습니까? 나는 boost::iterator_facade과 같은 것을 생각하고 있지만, 컨테이너에 대해서.STL 호환 컨테이너에 대한 상용구 typedef

나는 내 자신을 롤업하려고했지만, 그런 것이 존재하지 않았는지 확인하려고했습니다.

는 UPDATE :

이 내가 생각 해낸 유틸리티 기본 클래스이며, 경우에 사람이 유용 발견 : 사용자 컨테이너의 기본 컨테이너의

template <class C> 
class ContainerAdapter 
{ 
public: 
    typedef C::value_type value_type; 
    typedef C::reference reference; 
    typedef C::const_reference const_reference; 
    typedef C::const_iterator iterator; 
    typedef C::const_iterator const_iterator; 
    typedef C::difference_type difference_type; 
    typedef C::size_type size_type; 

protected: 
    typedef C::container_type; 
}; 


// Usage 
class MyCustomContainer : public ContainerAdapter< std::vector<int> > 
{ 
... 
}; 

ContainerAdapter 단순히 "에코"중첩 된 형식 정의를. 정말로 아무 것도 없습니다.

+0

사람들은 value_type과 iterator를 대안보다 쉽게 ​​사용할 수 있지만 일반적으로 참조 대신 value_type &을 사용합니다 (예 : 벡터 은 악의입니다). 다른 중첩 된 typedef를 제공하는 것이 유리한가요? 일반적으로 나는 항목을 const로 어쨌든 바인딩 할 함수에 전달하고 중첩 된 const_reference typedef는 절대 건드리지 않는다. –

+0

@Fred : BOOST_FOREACH, boost range, std :: back_insertion_iterator 등과 같은 컨테이너와 호환되는 것에 대해 걱정하고 있습니다. 모든 typedef 중 최소한의 하위 집합 만 제공하면됩니다. 어느. 실험하고 알아내는 것이 쉽다 고 생각합니다. –

+0

사실이지만 일반 유틸리티는 일반적으로 불가 지론으로 작성됩니다. 0x auto는 자동으로 좋습니다. :) –

답변

1

존재하는 경우에도 여전히 typedef typename base::size_type size_type이 필요합니다. 많은 것을 얻지 못할 것 같습니다.

+0

typedef를 클래스 선언 내에서 볼 수있게하려면 파생 클래스에서 re-typedef 만 필요합니다. 사용자 정의 컨테이너의 사용자는 기본 클래스에서 상속 된 모든 typedef를 계속 볼 수 있습니다. 이것은'boost :: iterator_facade'가 작동하는 방법입니다. –

+0

@Emilie 알아요.하지만 컨테이너를 가정 할 때 운영자와 그 유형을 사용할 다른 것들을 제공해야합니다. – Anycorn

+0

@aaa : 필자가 정말로 필요로하는 유일한 typedef는'iterator'와'const_iterator' 다.'T','T &','const T &'등 항상 사용할 수있다. 그러나 멤버 함수 선언에'reference','value_type' 등을 갖는 것이 문서의 관점에서 더 낫다는 것을 인정합니다. –

관련 문제