В книге, которую я читаю, есть пример класса, который используется для объяснения концепций:
class Gameboard{
public:
Gameboard(int inWidth, int inHeight);
Gameboard(const Spreadsheet& src);
Gameboard& operator=(const Spreadsheet& rhs);
private:
GamePiece** mCells;
size_t width;
size_t height;
};
затем они вводят шаблоны и вводят обновленный класс:
template<typename T>
class Grid{
public:
Grid<T>(int inWidth, int inHeight);
Grid<T>(const T& src);
Grid<T>& operator=(const T& rhs);
private:
T** mCells;
size_t width;
size_t height;
};
наконец, они вводят нетиповые параметры шаблона и говорят, что теперь вы можете сделать это:
template<typename T, size_t WIDTH, size_t HEIGHT>
class Grid{
public:
Grid<T>();
Grid<T>(const T& src);
Grid<T>& operator=(const T& rhs);
private:
T mCells[WIDTH][HEIGHT];
};
Из книги:
В классе шаблона Grid вы можете использовать нетиповые параметры шаблона, чтобы указать высоту и ширину сетки вместо их указания в конструкторе. Принципиальное преимущество указания нетиповых параметров в списке шаблонов вместо конструктора состоит в том, что значения известны до компиляции кода. Напомним, что компилятор генерирует код для шаблонных методов, подставляя параметры шаблона перед компиляцией. Таким образом, вы можете использовать в своей реализации обычный двумерный массив вместо его динамического выделения.
Я не испытываю восторга от такого подхода к динамическому распределению памяти. Во-первых, означает ли это, что многомерный массив будет находиться в стеке (потому что они, похоже, предполагают, что он не будет динамически выделяться)? Я не понимаю, почему вы не хотите динамически выделять память в куче?
Во-вторых, есть ли какое-то правило C++ (о котором я забываю), которое запрещает объявлять многомерный массив в стеке, отсюда и волнение с этим подходом?
Я пытаюсь понять, в чем преимущество использования нетиповых параметров шаблона в их примере.
std::array
, например, идет по тому же маршруту, предлагая альтернативуstd::vector
. - person pepper_chico   schedule 29.06.2014