在const函数中使用安全的非const函数

时间:2013-12-12 16:01:34

标签: c++ eigen const-correctness

我需要在我的流运算符MatrixSequence::matrix中使用ostream& operator<<(ostream &outputStream, const MatrixSequence &sequence),所以我需要它是const。但是它使用的Map<Matrix>似乎并不安全。我收到了错误

matrixsequence.cpp:38: error: invalid conversion from 'const double*' to 'Eigen::Map<Eigen::Matrix<double, -1, -1> >::PointerArgType {aka double*}' [-fpermissive]

当我将最终的const keywrk添加到MatrixSequence::Matrix

typedef Eigen::MatrixXd Matrix;
typedef Eigen::Map Map;

Map<Matrix> MatrixSequence::matrix(const unsigned int i) const {
    assert(i <= shapes_->size());
    const double* beginning = &data_.at(beginning_matrix->at(i));
    const tuple<int, int>& shape = shapes_->at(i);
    return Map<Matrix>(beginning, get<0>(shape), get<1>(shape));
}

ostream& operator<<(ostream &outputStream,
                    const MatrixSequence &sequence) {
    for(unsigned int i=0; i<sequence.size(); i++) {
        outputStream << "\n" << sequence.matrix(i) << "\n";
    }
    return outputStream;
}

2 个答案:

答案 0 :(得分:0)

如果你确定你的函数是const安全的,你可以使用const_cast<target_type>抛弃constness。 以这种方式修改const值是未定义的行为。

答案 1 :(得分:0)

正如评论中所建议的那样,更清晰的解决方案是返回Map<const MatrixXd>,如自包含示例中所示:

#include <Eigen/Core>
using namespace Eigen;

struct Foo {
  double data[10];

  Eigen::Map<const MatrixXd> foo() const {
    Map<const MatrixXd> out(data, 5, 2);
    return out;
  }
};

int main() {
  Foo f;
  MatrixXd A = 2 * f.foo();;
}