2012-09-19 3 views
1

나는 반복자에 대한 참조를 반환하지만 boost :: iterator_facade <>?를 사용하여 const_iterator에 대한 const_ref를 반환합니다.

template <typename Node> 
class BSTIteratorBase : public boost::iterator_facade< 
    BSTIteratorBase<Node>, 
    typename Node::value_type, 
    boost::forward_traversal_tag 
> 
{ ... 
    value_type& dereference() const 
    { return const_cast<value_type&>(nodePtr_->value_); } // Ouch! const_iterator may modify 
... }; 

value_type

BSTNode 클래스의 const와에 의존하지 않고, 같은 클래스가 있습니다. 그래서 const_cast<value_type&>() 부분을 유지해야했습니다. const_iteratorconst_ref을 반환하지만 iterator이 수정 가능한 ref을 반환하는 것을 어떻게 확인할 수 있습니까?

template<class T> 
struct ValueTypeOf { 
    typedef typename T::value_type type; 
}; 

template<class T> 
struct ValueTypeOf<T const> { 
    typedef typename T::value_type const type; 
}; 

template <typename Node> 
class BSTIteratorBase : public boost::iterator_facade< 
    BSTIteratorBase<Node>, 
    typename ValueTypeOf<Node>::type, 
    boost::forward_traversal_tag 
> 
// ... 

답변

0

당신은 그것의 바깥 유형이 CONST 경우 value_type을 constifies metafunction을 사용할 수 있습니다 쓰기를 기울여야한다.

typedef BSTIteratorBase<BSTNode<T>>    iterator; 
typedef BSTIteratorBase<const BSTNode<const T>> const_iterator; 
             ^-- note extra const 

T ** ->const T *const * 변형을 멋지게 반영합니다.

0

내가 좋겠 : 여기에 관련 구조체에는,

template <typename T> 
class BinarySearchTree 
{ 
public: 
    typedef T         value_type; 
    typedef T&         reference; 
    typedef const T&       const_reference; 
    typedef BSTNode<T>       node_type;  
    typedef BSTNode<T>&       node_reference; 
    typedef BSTNode<T>*       node_pointer; 
    typedef BSTIteratorBase<BSTNode<T>>   iterator; 
    typedef BSTIteratorBase<const BSTNode<T>> const_iterator; 

그리고 노드 클래스,

template <typename T> 
class BSTNode 
{ 
public: 
    typedef T   value_type; 
    typedef T&   reference; 
    typedef const T& const_reference; 
    typedef BSTNode  node_type; 
    typedef BSTNode* node_pointer; 

    // ctors, dtor 

private: 
    template <class> friend class BSTIteratorBase; 
    template <class> friend class BinarySearchTree; 

    T value_; 
    node_pointer leftPtr_; 
    node_pointer rightPtr_; 
}; 
+0

'T **'->'const T * const *'형식의 변환이 유용 할 때를 설명하십시오. – Hindol

+0

@Hindol 인수를 수정할 필요가없는 함수에'T **'를 전달하고자 할 때. 그것은 [FAQ에서 18.17]입니다 (http://www.parashift.com/c++-faq/constptrptr-conversion.html). – ecatmur