Здравствуйте, 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!"; // и даже так :-)
...