C++ 有没有更好的方法来实现成员函数row()的const版本而不使用const_cast?

C++ 有没有更好的方法来实现成员函数row()的const版本而不使用const_cast?,c++,c++11,matrix,valarray,C++,C++11,Matrix,Valarray,示例来自std::slice和std::slice_数组的使用演示: 如何正确定义成员函数行()的常量版本?下面的代码可以编译,但它使用const_cast。如果您能提出任何建议,我将不胜感激 #include <iostream> #include <valarray> class Matrix { std::valarray<int> data; int dim; public: Matrix(int r, int c) :

示例来自std::slice和std::slice_数组的使用演示:

如何正确定义成员函数行()的常量版本?下面的代码可以编译,但它使用const_cast。如果您能提出任何建议,我将不胜感激

#include <iostream>
#include <valarray>
class Matrix {
    std::valarray<int> data;
    int dim;
 public:
    Matrix(int r, int c) : data(r*c), dim(c) {}
    int& operator()(int r, int c) {return data[r*dim + c];}
    std::slice_array<int> row(std::size_t row) {
        return data[std::slice(dim*row, dim, 1)];
    }
    const std::slice_array<int> row(std::size_t row) const {
        return const_cast<std::valarray<int>&>(data)[std::slice(dim*row, dim, 1)];
    }
};
int main()
{
    Matrix m(3,3);
    int n = 0;
    for(int r=0; r<3; ++r)
       for(int c=0; c<3; ++c)
           m(r, c) = ++n;
    
    const Matrix m2(m);

    for(int r=0; r<3; ++r) {
        for(int c=0; c<3; ++c) {
            std::cout << m(r, c) << " ";
        }
        std::cout << std::endl;
    }

    // non-const
    std::slice_array<int> isa = m.row(0);
    std::valarray<int> iva(isa);
    for (auto elem : iva) { std::cout << elem << std::endl;} 
    
    // const
    const std::slice_array<int> isa2 = m2.row(0);
    const std::valarray<int> iva2(isa2);
    for (auto elem : iva) { std::cout << elem << std::endl;} 

    return 0;
}
#包括
#包括
类矩阵{
std::valarray数据;
int-dim;
公众:
矩阵(intr,intc):数据(r*c),dim(c){
int&operator()(int r,int c){返回数据[r*dim+c];}
std::切片数组行(std::大小数组行){
返回数据[std::切片(尺寸*行,尺寸,1)];
}
常量std::切片数组行(std::size\t行)常量{
返回常量转换(数据)[标准::切片(尺寸*行,尺寸,1)];
}
};
int main()
{
矩阵m(3,3);
int n=0;

对于(int r=0;r请注意,在返回值类型
const std::slice_array
中,编译器忽略顶级
const
限定符,因此实际返回类型为
std::slice_array

您可能需要一个到常量元素的切片,而不是一个到可变元素的常量切片


:

std::slice_数组运算符[](std::slice slicearr);
std::valarray运算符[](std::slice slicearr)常量;
const
版本返回元素的副本,因此无法实现将切片返回到常量元素



<> >代码:STAR::ValSuth是一个奇怪的畜牲,在C++标准库中线性代数支持的长期弃置尝试。对于生产代码,您可能喜欢使用特征库:

< P>注意,返回值类型<代码> const STD::SLICEIGHARCHORIZOR> ,顶层<代码> const 限定符被编译器忽略,从而使实际RETurn类型是std::slice\u数组

您可能需要一个到常量元素的切片,而不是一个到可变元素的常量切片


:

std::slice_数组运算符[](std::slice slicearr);
std::valarray运算符[](std::slice slicearr)常量;
const
版本返回元素的副本,因此无法实现将切片返回到常量元素


<>代码> STD::ValSux是一个奇怪的怪兽,C++标准库中线性代数支持的长期弃置尝试。对于生产代码,您可能喜欢使用特征库:

    const std::slice_array<int> row(std::size_t row) const {
        return data[std::slice(dim*row, dim, 1)];
    }

valarray_demo.cpp:13:16: error: no viable conversion from returned value of type '__val_expr<__slice_expr<const std::__1::valarray<int> &> >' to function return type 'const std::slice_array<int>'
        return data[std::slice(dim*row, dim, 1)];
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/valarray:1149:28: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from
      '__val_expr<__slice_expr<const std::__1::valarray<int> &> >' to 'const std::__1::slice_array<int> &' for 1st argument
class _LIBCPP_TEMPLATE_VIS slice_array
std::slice_array<T> operator[](std::slice slicearr);
std::valarray<T>    operator[](std::slice slicearr) const;