我已经实施了
template<int M, int N, typename T=double>
class matrix{
// ...
}
并且希望能够matrix<1,1,T>
使用T
。
我该如何做到这一点?以下是否有效?
template<typename T>
operator T(matrix<1, 1, T> mat) {
return mat(0,0);
}
(甚至期望遇到matrix<1,1,T>
的原因是某些矩阵表达式具有该类型。例如,将matrix<1,3>
乘以matrix<3,1>
评估为matrix<1,1>
。)
答案 0 :(得分:3)
您列出的代码无法编译,因为您实际上是在T
的定义之外尝试实现T
构造函数;或者如果它是基本类型或数组,它就更没意义了。
您可以做的是在矩阵类中实现一个强制转换运算符 - 通过将其添加到常规模板或为M = 1和N = 1专门设置matrix
。
第一个选项如下:
template<int M, int N, typename T=double>
class matrix{
// ...
operator T() const {
static_assert(M == 1 and N==1,
"Attempting to treat a matrix with multiple cells as a scalar");
// code to return the single matrix element
}
}
和第二个:
template<int M, int N, typename T=double>
class matrix{
// ...
}
template<typename T=double>
class matrix<1, 1, T>{
// ... some code duplication here with the main template; or maybe
// actually have different implementation banking on the fact that
// it's really just a scalar.
operator T() const {
// code to return the single matrix element
}
}
但坦率地说,我不认为我推荐任何这些选项。我可能会做以下其中一项:
template <typename T> T as_scalar(const matrix<1,1,T> m)
函数。答案 1 :(得分:0)
将它放在类定义中:
template<int Md=M, int Nd=N, typename = std::enable_if_t<Md==1 && Nd==1>>
operator T() const {
return (*this)(0,0);
}