$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Thorsten Ottosen (nesotto_at_[hidden])
Date: 2003-03-02 16:11:21
"David Abrahams" <dave_at_[hidden]> wrote in message
news:uwujhsdy6.fsf_at_boost-consulting.com...
> "Thorsten Ottosen" <nesotto_at_[hidden]> writes:
> > I see your point. Does anyone have a nice idea of how to detect when the
> > template argument is an iterator?
>
> Sadly, there is no reliable way. The closest thing I can imagine is
> to use SFINAE to check that iterator_traits<T> has valid types, and
> that the types are consistent with the iterator requirements.
I imagine that will be rather non-portable (Comeau and ?). This seems to
work for como, gcc3.2, vc7:
template< typename C, typename T, typename D,
typename P, typename R >
true_t is_iterator( const std::iterator<C,T,D,P,R>& );
template< typename C >
true_t is_iterator( const std::back_insert_iterator<C>& );
template< typename C >
true_t is_iterator( const std::front_insert_iterator<C>& );
template< typename C >
true_t is_iterator( const std::insert_iterator<C>& );
template< typename T, typename C, typename Tr >
true_t is_iterator( const std::istream_iterator<T,C,Tr>& );
template< typename T, typename C, typename Tr >
true_t is_iterator( const std::ostream_iterator<T,C,Tr>& );
template< typename C, typename Tr >
true_t is_iterator( const std::istreambuf_iterator<C,Tr>& );
template< typename C, typename Tr >
true_t is_iterator( const std::ostreambuf_iterator<C,Tr>& );
false_t is_iterator( ... );
but I'm wondering if that is enough. Can anybody come up with some cases
which will fail here and which is important?
regards
Thorsten