C ++矩阵模板类切片

时间:2015-02-13 11:30:26

标签: c++ templates c++11 matrix slice

为了了解C ++模板,我正在编写一个简单的Matrix类。到目前为止,它一直运行良好,但我想添加切片矩阵的功能,以提取子矩阵。我正在努力弄清楚如何定义返回矩阵的大小。我尝试过以下方法:

#include <cstdint>
#include <array>
#include <initializer_list>

template<typename T, std::size_t M, std::size_t N>
class Matrix
{
    public:
        Matrix(void): m_data{0} {}

        Matrix(const std::initializer_list<std::initializer_list<T>> m)
        {
            for(auto i = m.begin(); i != m.end(); i++)
            {
                for(auto j = i->begin(); j != i->end(); j++)
                {
                    (*this)(i - m.begin(), j - i->begin()) = *j;
                }
            }
        }

        T& operator()(const std::size_t i, const std::size_t j)
        {
            return m_data.at(i + j * N);
        }

        const T& operator()(const std::size_t i, const std::size_t j) const
        {
            return m_data.at(i + j * N);
        }

        template<std::size_t X, std::size_t Y>
        Matrix<T,X,Y> slice(const std::size_t iStart, const std::size_t iEnd, const std::size_t jStart, const std::size_t jEnd)
        {
            Matrix<T,iEnd-iStart+1,jEnd-jStart+1> result;

            for(std::size_t i = iStart; i <= iEnd; i++)
            {
                for(std::size_t j = jStart; j <= jEnd; j++)
                {
                    result(i - iStart, j - jStart) = (*this)(i,j);
                }
            }

            return result;
        }
};

int main(void)
{
    Matrix<double,3,3> m1 = {{1,2,3},{4,5,6},{7,8,9}};
    Matrix<double,2,2> m2 = m1.slice(0,1,0,1);
    return 0;
}

但我只是说错误'iEnd' is not a constant expression。什么是正确的方法呢?

1 个答案:

答案 0 :(得分:1)

您无法使用函数参数来实例化模板。您需要将大小作为模板参数传递给slice

template<std::size_t iStart, std::size_t iEnd, std::size_t jStart, std::size_t jEnd,
         std::size_t I = iEnd-iStart+1, std::size_t J = jEnd-jStart+1>
Matrix<T,I,J> slice()
{
    Matrix<T,I,J> result;
    ///...
    return result;
}