История изменений
Исправление www_linux_org_ru, (текущая версия) :
Можно уточнить?
#include <iostream>
#include <vector>
class Int { /// тут можно (или даже нужно) зафрендить Array чтобы менять value
public:
operator int () { return value; }
Int(int value): value(value) {}
private:
int value;
};
Int n(3);
Int m(3);
template<Int& dimension, class Element> class Array
{
public:
Element& operator[] (int i) { if( i<0 || i=>dimension) throw "bounds"; return array[i]; }
Array(): array(dimension) {}
private:
std::vector<Element> array;
};
int main()
{
Array<m,double> a;
Array<n,double> b; /// a другого типа, чем b, хотя и m=n=3
a[2]=2.5;
std::cout << a[0] << " " << a[1] << " " << a[2] << "\n";
return 0;
}
а вот это:
int n; int main() { n = ...; int y[n]; }
так нельзя; а еще, кстати, придется приличный слой писать для совместимости между классом Array и встроенными массивами, и там тоже глубокие омуты
Исходная версия www_linux_org_ru, :
Можно уточнить?
#include <iostream>
#include <vector>
class Int { /// тут можно (или даже нужно) зафрендить Array чтобы менять value
public:
operator int () { return value; }
Int(int value): value(value) {}
private:
int value;
};
Int n(3);
Int m(3);
template<Int& dimension, class Element> class Array
{
public:
Element& operator[] (int i) { if( i<0 || i=>dimension) throw "bounds"; return array[i]; }
Array(): array(dimension) {}
private:
std::vector<Element> array;
};
int main()
{
Array<m,double> a;
Array<n,double> b;
a[2]=2.5;
std::cout << a[0] << " " << a[1] << " " << a[2] << "\n";
return 0;
}
а вот это:
int n; int main() { n = ...; int y[n]; }
так нельзя; а еще, кстати, придется приличный слой писать для совместимости между классом Array и встроенными массивами, и там тоже глубокие омуты