【发布时间】:2020-01-17 14:50:19
【问题描述】:
我有Matrix 的课程,如果R = 3 和C = 1,我想要len() 的专用方法。
我想有标准库的解决方案。
继承不是解决方案,因为它也不适用于基类。
普通模板特化,如
template<class T>
class Matrix<T, 3, 1> {
public:
T len() const {return 3;}
};
会迫使我实现所有其他Matrix<T, R, C> 方法和东西。 (?)
想法:
- std::enable_if
- constexpr
- ...
#include <vector>
template<class T, std::size_t R, std::size_t C>
class Matrix {
private:
std::vector <T> data;
public:
T len() const;
};
一个肮脏的解决方案是:
template<class T, std::size_t R, std::size_t C>
T Matrix<T, R, C>::len() const {
if constexpr (R == 3 && C == 1) {
return 3;
}
throw std::runtime_error("len not available");
}
【问题讨论】:
-
@Evg:他希望将一行矩阵视为向量,因此具有计算长度等向量功能。
-
“普通模板专业化 [..] 将迫使我实现所有其他
Matrix<T, R, C>方法和东西。” 如果您拆分基本Matrix实现和可定制部分,你应该避免重复。 -
C++20 会有
requires。 -
static_assert(R ==3 && C == 1);似乎比 throw 好。 -
@Evg:浮点向量的长度应该是浮点数。此外,为什么需要将其限制为 3 列向量并不是特别相关;问题是怎么做。
标签: c++ templates c++17 template-specialization