LINUX.ORG.RU

История изменений

Исправление 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 и встроенными массивами, и там тоже глубокие омуты