模板化隐式类型转换运算符

时间:2018-05-03 23:20:19

标签: c++ c++11 templates casting

我已经实施了

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> 。)

2 个答案:

答案 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
    }
}

但坦率地说,我不认为我推荐任何这些选项。我可能会做以下其中一项:

  • 改变T的功能,以便它能够自然地#34;采用1x1矩阵(例如通过模板化)
  • 改变T的功能,以便它能够自然地#34;取任何矩阵。很多标量工作都对矩阵有一个有趣的推广。
  • 明确转换,或许写一个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);
}