【发布时间】:2014-08-19 18:55:10
【问题描述】:
我正在阅读的书中有一个示例类用于解释概念:
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的替代品。
标签: c++ templates multidimensional-array non-type