有一本書的示例類我讀始終用來解釋概念:模板非類型參數和分配陣列存儲
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];
};
從書:
在網格模板類,你可以使用非類型模板參數指定網格的高度和寬度,而不是在構造函數中指定它們。在模板列表中指定非類型參數而不是構造函數的主要優點是,在編譯代碼之前,這些值是已知的。回想一下,在編譯之前,編譯器通過替換模板參數來爲模板化方法生成代碼。 因此,您可以在您的實施中使用普通的二維數組,而不是動態分配它。
我不明白這種動態內存分配方法的興奮。首先,這是否意味着多維數組將會在棧上(因爲它們似乎暗示它不會被動態分配)?我不明白爲什麼你不想動態分配堆上的內存?其次,是否存在一些C++規則(我忘記了),它禁止在棧上聲明多維數組,因此這種方法的興奮?
我想了解在他們的例子中使用非類型模板參數的優點是什麼。
把它看作是說明性的,不斷學習,看看其他信息來源。我不能僅僅通過這個例子來判斷這本書,所以對我來說這不是很有說服力,有許多設計決策可以讓你使用這種類型的環境,['std :: array'](http:///en.cppreference.com/w/cpp/container/array),例如,在相同的路線中提供替代['std :: vector'](http://en.cppreference.com/w/cpp/容器/載體)。 –