Как удобно определить класс со статическим 2d-массивом (а размер 2-мерного массива известен только во время компиляции)? - PullRequest
1 голос
/ 02 февраля 2012

Пример кода ниже показывает, что я пытаюсь сделать:

template<int NX, int NY>
class Array
{
public:
  float v[NX][NY];
};

void main()
{
  Array<10,20> grid;
}

Приведенный выше код не будет компилироваться, но он показывает, что я хочу сделать. У нас есть класс, который содержит массив, и класс массива не знает его размера до момента компиляции. Есть ли простой способ сделать это?

Редактировать: я хочу написать простой класс многоразового использования. Это означает, что мне нужно найти хороший способ отделить размер массива от класса.

Я также хочу, чтобы класс был быстрым (и простым), поэтому он не должен выделяться динамически. Это означает, что размер не может быть задан во время выполнения.

Я также не хочу использовать препроцессор для определения размера, потому что это означает, что мне придется пройти через стычку изменения числа где-то. Это недостаточно удобно.

По сути, класс не знает свой собственный размер до момента компиляции, потому что именно тогда основная функция сообщает классу его размер.

Редактировать: вышеуказанный код хорош.

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Кроме main, не возвращающего int, это юридический код, и его следует скомпилировать. Фактически, на некоторых компиляторах это компилируется без main, возвращающего int, такого как VC ++, но это нестандартное поведение .

Вы также можете сохранить размер во время компиляции, чтобы вам не приходилось вычислять его вручную.

#include <iostream>

template<int NX, int NY>
class Array
{
public:
  float v[NX][NY];

  int size() const { return ArraySize; }

private:
  enum { ArraySize = NX * NY }; // You can also store rows/cols individually
};

int main()
{
  Array<10,20> grid;

  std::cout << grid.size();

  return 0;
}
0 голосов
/ 02 февраля 2012

Boost.MultiArray может соответствовать вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...