Re: Малая механизация: C++, slices
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 05.06.06 03:49
Оценка: 26 (1)
Здравствуйте, c-smile, Вы писали:

CS>Вот slices в стиле D arrays.


Можно использовать iterator_range? Например
boost::sub_range,
boost::iterator_range.

CS>Вот весь код, успехов.


...
CS> template <typename T >
CS> struct slice
CS> {
...
CS>    slice(): start(0), length(0) {}
CS>    slice(const T* start_, size_t length_) { start = start_; length = length_; }


CS>    slice(const slice& src): start(src.start), length(src.length) {}
CS>    slice(const T* start_, const T* end_): start(start_), length( max(end_-start_,0)) {}

    // Добавим еще один полезный конструктор. Его можно сделать explicit, по желанию.
    template<std::size_t Size>
    slice(const T (&X)[Size]): start(X), length(Size) {}
...
CS> };
  
// убираем макрос и делаем ему достойную замену:
// #define MAKE_SLICE( T, D ) slice<T>(D, sizeof(D) / sizeof(D[0]))
template<class T, std::size_t Size>
slice<T> make_slice(const T (&X)[Size]) { return slice<T>(X); }


...


// инициализация по новому и по разному:
CS>  //slice<int> s1 = MAKE_SLICE( int, v1 );
CS>  //slice<int> s2 = MAKE_SLICE( int, v2 );
CS>  //slice<int> s3 = MAKE_SLICE( int, v3 );
CS>  //slice<int> s4 = MAKE_SLICE( int, v4 );
CS>  //slice<int> s5 = MAKE_SLICE( int, v5 );
  slice<int> s1(v1); // MAKE_SLICE( int, v1 );
  slice<int> s2 = slice<int>(v2); // MAKE_SLICE( int, v2 );
  slice<int> s3 = make_slice(v3); // MAKE_SLICE( int, v3 );
  slice<int> s4 = v4; // MAKE_SLICE( int, v4 );
  slice<int> s5 = make_slice(v5); // MAKE_SLICE( int, v5 );

  slice<char> c7 = "Hello world!"; // и даже так :-)


...
getboost.codeplex.com
citylizard.codeplex.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.