【发布时间】:2017-09-12 14:47:30
【问题描述】:
我有一个矩阵类
template<typename Type, size_t Rows, size_t Columns> class Matrix
{
public:
Type Entries[Rows][Columns];
// Operators, etc.
};
然后我需要对这个类进行特化(对于方阵等),这意味着我需要为每个特化重写整个类的实现。然后我开始考虑避免代码重复的方法。
想到的第一个想法是在基础模板中定义专门化的函数,但删除它们,这样它们就不能在基础模板中使用,并在类之外定义专门化。
// Inside class definition
auto GetDeterminant() const -> T = delete;
// Outside class definition
template<typename Type, size_t Size> Matrix<T, Size, Size>::GetDeterminant() const -> T
{
// Implementation
}
但后来,在遇到一些错误后,我了解到部分专业化的功能模板是不允许的。所以我尝试了这些方法
方法一:
template<typename Derived, typename Type, size_t Rows, size_t Columns> class MatrixBase
{
public:
T Entries[Row][Columns];
// Operators, etc.
}
template<typename Type, size_t Rows, size_t Columns> class Matrix : public MatrixBase<Matrix<Type, Rows, Columns>, Rows, Columns>
{
// General MxN matrix stuff
}
template<typename Type, size_t Size> class Matrix<T, Size, Size> : public MatrixBase<Matrix<T, Size, Size>, Size, Size>
{
public:
// Specific MxM matrix stuff
}
在这里,我实现了 CRTP,就像在另一个 question 上看到的那样,但是我觉得抽象有点不需要,尽管可能有更好的方法。所以我想出了另一种方法。
方法二:
template<typename T, size_t Rows, size_t Columns> class Matrix
{
public:
T Entries[Rows][Columns]
auto GetDeterminant() const -> T
{
static_assert(Rows == Columns);
// Some computations
}
}
这似乎很好,如果有人试图在非方阵上使用它,他们会得到一个编译时错误。
问题:
有没有办法只使用模板来解决这个问题?还是我应该坚持使用其中一种方法?
【问题讨论】:
-
我喜欢
static_assert方法。
标签: c++ c++11 templates template-specialization