#include <iostream>
using std::cout;
using std::endl;
#define SIZE_INT 5
#define SIZE_DOUBLE 4
#define DEFAULT_SIZE 6
template <class T = int, int size = DEFAULT_SIZE> class Test {
private:
T arr[size];
public:
Test() {
for (int i = 0; i < size; i++)
arr[i] = i + 2;
}
T &operator[](int i);
void print(void);
};
template <class T, int size>
T &Test<T, size>::operator[](int i)
{
if (i < 0 || i > size - 1) {
cout << "index: " << i << " is out of range" << endl;
return arr[size - 1];
}
return arr[i];
}
template <class T, int size>
void Test<T, size>::print(void)
{
for (int i = 0; i < size; i++)
cout << arr[i] << ' ';
cout << endl;
}
int main()
{
Test<int, SIZE_INT> iobj1;
for (int i = 0; i < SIZE_INT; i++)
iobj1[i] = i + 3;
iobj1.print();
Test<> iobj2;
for (int i = 0; i < DEFAULT_SIZE; i++)
iobj2[i] = i + 5;
iobj2.print();
Test<> iobj3;
iobj3.print();
Test<double, SIZE_DOUBLE> dobj;
for (int i = 0; i < SIZE_DOUBLE; i++)
dobj[i] = (double)(i + 1) / 5;
dobj.print();
}
/*
run:
3 4 5 6 7
5 6 7 8 9 10
2 3 4 5 6 7
0.2 0.4 0.6 0.8
*/