#include <iostream>
#include <algorithm>
template<typename T, size_t L, size_t H>
class Array
{
public:
static_assert(H >= L);
static const size_t Low = L;
static const size_t High = H;
static const size_t Length = (H - L + 1);
// stuff ...
template<size_t Lb, size_t Hb>
operator Array<T, Lb, Hb>() const
{
static_assert(Length == Array<T, Lb, Hb>::Length);
Array<T, Lb, Hb> converted;
std::copy_n(actualArray, Length, converted.actualArray);
return converted;
}
// just to show that you don't need an offset member...
T& operator[](size_t idx)
{
return actualArray[idx - L];
}
T operator[](size_t idx) const
{
return actualArray[idx - L];
}
template<typename, size_t, size_t>
friend class Array;
private:
T actualArray[Length];
};
template<typename T, size_t L, size_t H>
void printArray(const Array<T, L, H> &arr)
{
for (size_t idx = arr.Low; idx <= arr.High; ++idx)
std::cout << arr[idx] << std::endl;
}
int main()
{
Array<int, 0, 2> arr1;
arr1[0] = 1;
arr1[1] = 2;
arr1[2] = 3;
printArray(arr1);
std::cout << std::endl;
Array<int, 5, 7> arr2;
arr2 = arr1;
printArray(arr2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IEwsIHNpemVfdCBIPgpjbGFzcyBBcnJheQp7CnB1YmxpYzoKICAgIHN0YXRpY19hc3NlcnQoSCA+PSBMKTsKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTG93ID0gTDsKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgSGlnaCA9IEg7CiAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IExlbmd0aCA9IChIIC0gTCArIDEpOwoKICAgIC8vIHN0dWZmIC4uLgoKICAgIHRlbXBsYXRlPHNpemVfdCBMYiwgc2l6ZV90IEhiPgogICAgb3BlcmF0b3IgQXJyYXk8VCwgTGIsIEhiPigpIGNvbnN0CiAgICB7CiAgICAgICAgc3RhdGljX2Fzc2VydChMZW5ndGggPT0gQXJyYXk8VCwgTGIsIEhiPjo6TGVuZ3RoKTsKICAgICAgICBBcnJheTxULCBMYiwgSGI+IGNvbnZlcnRlZDsKICAgICAgICBzdGQ6OmNvcHlfbihhY3R1YWxBcnJheSwgTGVuZ3RoLCBjb252ZXJ0ZWQuYWN0dWFsQXJyYXkpOwogICAgICAgIHJldHVybiBjb252ZXJ0ZWQ7CiAgICB9CgogICAgLy8ganVzdCB0byBzaG93IHRoYXQgeW91IGRvbid0IG5lZWQgYW4gb2Zmc2V0IG1lbWJlci4uLgoKICAgIFQmIG9wZXJhdG9yW10oc2l6ZV90IGlkeCkKICAgIHsKICAgICAgICByZXR1cm4gYWN0dWFsQXJyYXlbaWR4IC0gTF07CiAgICB9CgogICAgVCBvcGVyYXRvcltdKHNpemVfdCBpZHgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIGFjdHVhbEFycmF5W2lkeCAtIExdOwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lLCBzaXplX3QsIHNpemVfdD4KICAgIGZyaWVuZCBjbGFzcyBBcnJheTsKICAgIApwcml2YXRlOgogICAgVCBhY3R1YWxBcnJheVtMZW5ndGhdOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IEwsIHNpemVfdCBIPgp2b2lkIHByaW50QXJyYXkoY29uc3QgQXJyYXk8VCwgTCwgSD4gJmFycikKewogICAgZm9yIChzaXplX3QgaWR4ID0gYXJyLkxvdzsgaWR4IDw9IGFyci5IaWdoOyArK2lkeCkKICAgICAgICBzdGQ6OmNvdXQgPDwgYXJyW2lkeF0gPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgIEFycmF5PGludCwgMCwgMj4gYXJyMTsKICAgIGFycjFbMF0gPSAxOwogICAgYXJyMVsxXSA9IDI7CiAgICBhcnIxWzJdID0gMzsKICAgIHByaW50QXJyYXkoYXJyMSk7CgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCiAgICBBcnJheTxpbnQsIDUsIDc+IGFycjI7CiAgICBhcnIyID0gYXJyMTsKICAgIHByaW50QXJyYXkoYXJyMik7CgoJcmV0dXJuIDA7Cn0=