我正在研究特征矩阵类库,并且文档指出,可以使用以下模板参数实例化矩阵模板类:
Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
其中 Scalar
是矩阵系数的类型(double,float,int,复杂等)。RowsAtCompileTime
和ColsAtCompileTime
分别是矩阵尺寸。
例如,可以实例化浮子的4x4矩阵:
Matrix<float, 4, 4> matrix;
特征文档指出,在上一种情况下,由于行是在编译时已知的,对于"小型"矩阵,矩阵元素的内存是静态分配的。
但是,如果您选择动态分配内存(对于大型矩阵或由于在编译时不知道行数和列的数量),则可以使用以下模板实例化,该模板会动态分配内存:
Matrix<float, Dynamic, Dynamic> matrix;
我的问题是,使用C 模板机制在概念上如何实现?由于我对用于实现这一目标的C 技术非常感兴趣,所以有人可以给我一个简短的示例,其中使用堆栈类型以类似的方式控制内存分配?谢谢!
模板将是部分专业的来处理不同的分配。简而言之,
template <typename T, int N>
struct Vector {
T data[N];
};
static const int Dynamic = -1;
template <typename T>
struct Vector<T, Dynamic> {
T* data;
};
显然,在此示例中,许多接口都缺少,但是这突出了模板专业化的 Mechanics 的重要部分,以及不同基础存储的细节。构造函数(在专业中)将执行动态分配。
实际上,可以将存储的细节推迟到部分专业化的VectorStorage<T, Rows, Cols>
。Vector
将包含该类型的成员(使用其自己的参数正确实例化),并且大部分接口只能实现一次...
template <typename T, int N>
struct VectorStorage {
VectorStorage(const size_t) {}
T data[N];
};
static const int Dynamic = -1;
template <typename T>
struct VectorStorage<T, Dynamic> {
VectorStorage(const size_t n) : data(new T[n]) {}
~VectorStorage() { delete[] data; }
// define copy ops, etc.
T* data;
};
template <typename T, int N>
class Vector {
public:
Vector(const size_t n) : storage(n) {}
T operator[](const size_t i) const { return storage.data[i]; }
// etc.
private:
VectorStorage<T,N> storage;
};