// (C) Copyright 2008-2009 SDML (www.sdml.info) // // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include using namespace origin; using std::cout; // Requires InputIterator template < typename Iter, typename = typename concept_assert>::type> typename InputIterator::difference_type my_dist(Iter f, Iter l, typename concept_enable< InputIterator, Not> >::type* = 0) { cout << typestr() << ": " << "distance: InputIterator\n"; return 0; } // Requires RandomAccessIterator template < typename Iter, typename = typename concept_assert>::type> typename InputIterator::difference_type my_dist(Iter f, Iter l, typename concept_enable>::type* = 0) { cout << typestr() << ": " << "distance: RandomAccessIterator\n"; return 0; } // Requires InputIterator template size_t my_adv(Iter f, Iter l, int n, typename concept_enable< InputIterator, Not> >::type* = 0) { cout << typestr() << ": " << "advance: InputIterator\n"; return 0; } // Requires BidirectionalIterator template size_t my_adv(Iter f, Iter l, int n, typename concept_enable< BidirectionalIterator, Not> >::type* = 0) { cout << typestr() << ": " << "advance: BidirectionalIterator\n"; return 0; } // Requires RandomAccessIterator template size_t my_adv(Iter f, Iter l, int n, typename concept_enable>::type* = 0) { cout << typestr() << ": " << "advance: RandomAccessIterator\n"; return 0; } int main() { { int* p = 0, *q = 0; my_dist(p, q); my_adv(p, q , 0); } { std::forward_list::iterator p, q; my_dist(p, q); my_adv(p, q , 0); } { std::list::iterator p, q; my_dist(p, q); my_adv(p, q , 0); } { std::vector::iterator p, q; my_dist(p, q); my_adv(p, q , 0); } }