example.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 152 行

CPP
152
字号
// Boost.Range library////  Copyright Thorsten Ottosen 2003-2008. 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)//// For more information, see http://www.boost.org/libs/range///#include <boost/range.hpp>#include <iterator>         // for std::iterator_traits, std::distance()namespace Foo{        //        // Our sample UDT. A 'Pair'        // will work as a range when the stored        // elements are iterators.        //        template< class T >        struct Pair        {                T first, last;        };} // namespace 'Foo'namespace boost{        //        // Specialize metafunctions. We must include the range.hpp header.        // We must open the 'boost' namespace.        //        /*        template< class T >        struct range_value< Foo::Pair<T> >        {                typedef typename std::iterator_traits<T>::value_type type;        };        */        template< class T >        struct range_iterator< Foo::Pair<T> >        {                typedef T type;        };        template< class T >        struct range_const_iterator< Foo::Pair<T> >        {                //                // Remark: this is defined similar to 'range_iterator'                //         because the 'Pair' type does not distinguish                //         between an iterator and a const_iterator.                //                typedef T type;        };        /*    template< class T >        struct range_difference< Foo::Pair<T> >        {                typedef typename std::iterator_traits<T>::difference_type type;        };        */        template< class T >    struct range_size< Foo::Pair<T> >        {                int static_assertion[ sizeof( std::size_t ) >=                          sizeof( typename range_difference< Foo::Pair<T> >::type ) ];                typedef std::size_t type;        };} // namespace 'boost'namespace Foo{        //        // The required functions. These should be defined in        // the same namespace as 'Pair', in this case        // in namespace 'Foo'.        //        template< class T >        inline T boost_range_begin( Pair<T>& x )        {                return x.first;        }    template< class T >        inline T boost_range_begin( const Pair<T>& x )        {                return x.first;        }        template< class T >    inline T boost_range_end( Pair<T>& x )        {                return x.last;        }        template< class T >    inline T boost_range_end( const Pair<T>& x )        {                return x.last;        }        template< class T >        inline typename boost::range_size< Pair<T> >::type        boost_range_size( const Pair<T>& x )        {                return std::distance(x.first,x.last);        }} // namespace 'Foo'#include <vector>int main(){        typedef std::vector<int>::iterator  iter;        std::vector<int>                    vec;        vec.push_back( 42 );        Foo::Pair<iter>                     pair  = { vec.begin(), vec.end() };        const Foo::Pair<iter>&              cpair = pair;        //        // Notice that we call 'begin' etc with qualification.        //        iter i = boost::begin( pair );        iter e = boost::end( pair );        i      = boost::begin( cpair );        e      = boost::end( cpair );        boost::range_size< Foo::Pair<iter> >::type s = boost::size( pair );        s      = boost::size( cpair );        boost::range_const_reverse_iterator< Foo::Pair<iter> >::type        ri     = boost::rbegin( cpair ),        re         = boost::rend( cpair );        //        // Test metafunctions        //        boost::range_value< Foo::Pair<iter> >::type        v = *boost::begin(pair);        boost::range_difference< Foo::Pair<iter> >::type        d = boost::end(pair) - boost::begin(pair);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?