![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Method 2: provide free-standing functions and specialize metafunctionsBoost , Chapter 1. Range 2.0 , Extending the library
Эта процедура предполагает, что вы не можете (или не хотите) изменить типы, которые должны быть согласованы с концепцией Диапазона. Если это не так, см. метод 1. Основные шаблоны в этой библиотеке реализованы таким образом, что определенные функции можно найти с помощью аргументозависимого взгляда (ADL). Ниже приведен обзор того, какие бесплатные функции класс должен указывать на использование в качестве определенной концепции диапазона. Пусть
Вы также должны специализироваться на двух метафункциях для вашего типа
Здесь приведен полный пример: #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_mutable_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; }; } // 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 range_begin( Pair<T>& x ) { return x.first; } template< class T > inline T range_begin( const Pair<T>& x ) { return x.first; } template< class T > inline T range_end( Pair<T>& x ) { return x.last; } template< class T > inline T range_end( const Pair<T>& x ) { return x.last; } } // namespace 'Foo' #include <vector> int main(int argc, const char* argv[]) { typedef std::vector<int>::iterator iter; std::vector<int> vec; 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_difference< Foo::Pair<iter> >::type s = boost::size( pair ); s = boost::size( cpair ); boost::range_reverse_iterator< const Foo::Pair<iter> >::type ri = boost::rbegin( cpair ), re = boost::rend( cpair ); return 0; } Статья Method 2: provide free-standing functions and specialize metafunctions раздела Chapter 1. Range 2.0 Extending the library может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Extending the library ::
|
||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |