我正在尝试实现一个简单的线性代数库(用于学习目的)。
问题 => 我希望 Matrix
模板类在编译时声明一个固定大小的数组,或者如果 Rows
的数量和列
未知。
我怎样才能有效/正确地做到这一点? (我已经有了一个简单/幼稚的想法):
const long Dynamic = -1;
template<typename T, long Rows, long Cols>
class Matrix {
private:
enum {
kIsDynamicStorage = Rows == Dynamic || Cols == Dynamic
};
//?? conditional<is_dynamic_storage, vector<vector<T>>, T[Rows][Cols]> storage;
// Use for fixed-size
array<array<T, kIsDynamicStorage ? 0: Cols>, kIsDynamicStorage ? 0: Rows> storage;
// Use for dynamic size
vector<vector<T>> dynamic_storage;
public:
enum {
kRowsAtCompileTime = Rows,
kColsAtCompileTime = Cols
};
Matrix();
// Use for dynamic size
Matrix(size_t rows, size_t cols);
};
有没有正确/更好的方法来做到这一点?
最佳答案
使用 std::conditional
怎么样?
static constexpr bool isDS { (Rows == Dynamic) || (Cols == Dynamic) };
typename std::conditional<isDS,
std::vector<std::vector<T>>,
std::array<std::array<T, Cols>, Rows>>::type storage;
关于C++ 模板元程序。条件内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481037/