나는 반복자에 대한 참조를 반환하지만 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_iterator
이
const_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
>
// ...
'T **'->'const T * const *'형식의 변환이 유용 할 때를 설명하십시오. – Hindol
@Hindol 인수를 수정할 필요가없는 함수에'T **'를 전달하고자 할 때. 그것은 [FAQ에서 18.17]입니다 (http://www.parashift.com/c++-faq/constptrptr-conversion.html). – ecatmur