【发布时间】:2017-02-13 20:11:29
【问题描述】:
假设我有以下 Matrix 模板类,并且需要将向量表示为 1 x RowSize 或 ColSize x 1 矩阵(这样我就可以重用许多与向量兼容的矩阵运算符:乘以 2 个矩阵,乘以矩阵通过标量等):
template <class T, size_t ColumnSize, size_t RowSize>
struct Matrix {
T [ColumnSize][RowSize];
}
我有两个问题:
1) 如果我没记错的话,我可以通过部分专业化或在矩阵方法上使用 SFINAE 来实现这一点(例如,当 ColSize 或 RowSize 为 1 时启用“长度”方法)。上述选项的优缺点是什么?
2) 如果我选择使用部分特化,有没有办法为行向量和列向量定义一个特化,而不是这样:
template <class T, size_t ColumnSize>
struct Matrix<T, ColumnSize, 1> {
T length() const;
T [ColumnSize][RowSize];
}
template <class T, size_t RowSize>
struct Matrix<T, 1, RowSize> {
T length() const;
T [ColumnSize][RowSize];
}
【问题讨论】:
-
您应该提供更多上下文,否则您的问题是“基于意见的”。
-
如果你问两者的优缺点,我认为这会更好,因为这样更容易客观地回答。
-
建议:您可以将参数定义为
template<class T, size_t Size, VectorOrientation orientation> class Matrix和enum class VectorOrientation { ColumnVector, RowVector };。那么我认为就不会有歧义了。 -
请注意,在 C++ 中,二维数组主要是行,您应该使用
T [RowSize][ColumnSize];或更好的包装类在std::array<T,RowSize*ColumnSize>上。 -
您仍然可以拥有
template<class T, size_t ColumnSize, size_t RowSize> using MatrixAlias = Matrix<T, ColumnSize * RowSize, ColumnSize == 1 ? ColumnVector : RowSize == 1 ? RowVector : (throw "one of row or column size must be 1")>;
标签: c++