封装 ublas 并将常量引用重载到 operator()
Encapsulating ublas and overloading the const reference to the operator()
考虑下面的玩具示例,其中我声明了一个封装来自 boost 库ublas
的类:
#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <iostream>
namespace ublas = boost::numeric::ublas;
class UblasEncapsulated {
public:
ublas::compressed_matrix<float>::reference operator()(int i, int j){
std::cout << "Non const reference" << std::endl;
MtrUpdated_ = true;
return mtr_(i, j);
}
ublas::compressed_matrix<float>::const_reference operator()(
int i, int j) const {
std::cout << "Const reference" << std::endl;
return mtr_(i, j);
}
UblasEncapsulated() { MtrUpdated = false; }
private:
ublas::compressed_matrix<float> mtr_(3, 3);
bool MtrUpdated_;
};
int main() {
UblasEncapsulated foo;
foo(2, 0) = 1.0f;
float const foo_float = foo(2, 0);
return 0;
}
我期待输出
Non constant reference
Constant reference
但我得到了
Non constant reference
Non constant reference
我做错了什么?如何正确跟踪mtr_
何时可以更改其值?
foo
是非常量,因此将调用foo.operator()
的非常量版本。 如何使用它返回的值并不重要。
如果你真的想知道MtrUpdated_
只有在实际分配元素时才设置为 true,你将需要使用代理类:
class UblasEncapsulated {
public:
class proxy {
public:
proxy(UblasEncapsulated* ptr, int i, int j)
: ptr_(ptr), i_(i), j_(j)
{}
proxy& operator=(float f) {
ptr_->MtrUpdated_ = true;
ptr_->mtr_(i_, j_) = f;
return *this;
}
operator float() {
return ptr_->mtr_(i_, j_);
}
private:
UblasEncapsulated* ptr_;
int i_;
int j_;
};
proxy operator()(int i, int j) {
return proxy(this, i, j);
}
ublas::compressed_matrix<float>::const_reference operator() (int i, int j) const {
return mtr_(i, j);
}
UblasEncapsulated()
: mtr_(3, 3),
MtrUpdated_(false)
{}
private:
ublas::compressed_matrix<float> mtr_;
bool MtrUpdated_;
};
现场演示
请注意,如果可以侥幸逃脱,则应避免使用代理类,因为它不能很好地处理auto
或模板参数推导之类的东西。
相关文章:
- 运算符重载:"operator+"必须采用零个或一个参数
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 重载的 operator() 在 Cython 中失败
- C++ 继承:基类中重载 operator+ 的 2 次在派生类中无法正常工作
- 当试图交换可变模板类时,如何正确地重载operator=
- 错误:使用复制和交换习惯用法的交换函数中"operator="的重载不明确
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- 放置/分段语法是否可能出现懒惰"operator or"重载?
- C++ 重载:[错误] 与'operator='不匹配(操作数类型为 'String' 和"字符串")
- 在命名空间内的类中使用带有运算符重载的字符串流时"no match for ‘operator>>’"
- 封装 ublas 并将常量引用重载到 operator()
- 无法使用"enable_if"和"is_base_of"将模板函数"operator+"的重载限制到我的类层次结构
- 如何在不重载"operator()"、"std::less"、"std
- 运算符重载错误"no match for operator error"
- 如果我没有重载,为什么我会"no match for ‘operator=’"自定义类?
- 如何重载 std::vector::operator=()
- c++ operator =重载继承,是否需要在派生类中重新定义,尽管在基类中定义
- Std::for_each, operator()重载的对象不能维持状态
- c++ operator[]重载没有响应
- c++中虚继承中的Operator =重载