#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 ...
Array() = default;
template<size_t Lb, size_t Hb>
Array(const Array<T, Lb, Hb> &src)
{
static_assert(Length == Array<T, Lb, Hb>::Length);
std::copy_n(src.actualArray, Length, actualArray);
}
// 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+PSBMKTsKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTG93ID0gTDsKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgSGlnaCA9IEg7CiAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IExlbmd0aCA9IChIIC0gTCArIDEpOwoKICAgIC8vIHN0dWZmIC4uLgoKICAgIEFycmF5KCkgPSBkZWZhdWx0OwogICAgCiAgICB0ZW1wbGF0ZTxzaXplX3QgTGIsIHNpemVfdCBIYj4KICAgIEFycmF5KGNvbnN0IEFycmF5PFQsIExiLCBIYj4gJnNyYykKICAgIHsKICAgICAgICBzdGF0aWNfYXNzZXJ0KExlbmd0aCA9PSBBcnJheTxULCBMYiwgSGI+OjpMZW5ndGgpOwogICAgICAgIHN0ZDo6Y29weV9uKHNyYy5hY3R1YWxBcnJheSwgTGVuZ3RoLCBhY3R1YWxBcnJheSk7CiAgICB9CgogICAgLy8ganVzdCB0byBzaG93IHRoYXQgeW91IGRvbid0IG5lZWQgYW4gb2Zmc2V0IG1lbWJlci4uLgoKICAgIFQmIG9wZXJhdG9yW10oc2l6ZV90IGlkeCkKICAgIHsKICAgICAgICByZXR1cm4gYWN0dWFsQXJyYXlbaWR4IC0gTF07CiAgICB9CgogICAgVCBvcGVyYXRvcltdKHNpemVfdCBpZHgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIGFjdHVhbEFycmF5W2lkeCAtIExdOwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lLCBzaXplX3QsIHNpemVfdD4KICAgIGZyaWVuZCBjbGFzcyBBcnJheTsKICAgIApwcml2YXRlOgogICAgVCBhY3R1YWxBcnJheVtMZW5ndGhdOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IEwsIHNpemVfdCBIPgp2b2lkIHByaW50QXJyYXkoY29uc3QgQXJyYXk8VCwgTCwgSD4gJmFycikKewogICAgZm9yIChzaXplX3QgaWR4ID0gYXJyLkxvdzsgaWR4IDw9IGFyci5IaWdoOyArK2lkeCkKICAgICAgICBzdGQ6OmNvdXQgPDwgYXJyW2lkeF0gPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgIEFycmF5PGludCwgMCwgMj4gYXJyMTsKICAgIGFycjFbMF0gPSAxOwogICAgYXJyMVsxXSA9IDI7CiAgICBhcnIxWzJdID0gMzsKICAgIHByaW50QXJyYXkoYXJyMSk7CgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgQXJyYXk8aW50LCA1LCA3PiBhcnIyOwogICAgYXJyMiA9IGFycjE7CiAgICBwcmludEFycmF5KGFycjIpOwoKICAgIHJldHVybiAwOwp9