On Sat, 25 Jan 2003 11:48:52 -0000, "John Maddock" <[EMAIL PROTECTED]> wrote:
>There are all kind of useful uses for is_convertible that do not involve >converting anything as such, for example: > >template <class I> >struct is_random_access_iterator >{ >private: > typedef typename std::iterator_traits<I>::iterator_category cat; >public: > BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<cat*, >std::random_access_iterator_tag*>::value)); >}; Well, do you want to see if pointers are convertible? // see function templates in one of my other posts // template <class I> struct is_random_access_iterator { private: typedef typename std::iterator_traits<I>::iterator_category cat; public: BOOST_STATIC_CONSTANT(bool, value = (sizeof(yes_type) == sizeof(is_convertible<std::random_access_iterator_tag*>( (cat*)0 )) ) ); }; Or do you want to see if I's iterator_category *is* random_access_iterator_tag? template <typename T> struct is_random_access_iterator_tag { enum { value = false }; }; template <> struct is_random_access_iterator_tag<std::random_access_iterator_tag> { enum { value = true }; }; template <class I> struct is_random_access_iterator { private: typedef typename std::iterator_traits<I>::iterator_category cat; public: BOOST_STATIC_CONSTANT(bool, value = is_random_access_iterator_tag<cat>::value; ); }; >There are lots of other similar uses, particularly for concept checks and >the like... I don't doubt that. But have you an example that requires this abstract concept of "convertibility of a type" that we are not able to define? Genny. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost