我正在处理一个重载索引运算符([])的类。为了允许分配元素,操作符必须返回对元素的引用。例如:
var show_error = function (message) {
message = message || 'Something should be flashing here!';
$("#flash-messages").html('<div class="flashes"> <div class="flash-notice">' + message + '</div> </div>');
return false;
};
/*
show_error();
*/
/*
show_error('Something is Flashing!');
*/
在这种情况下,客户端代码可以使用返回的引用为元素分配值。但是,我想有一种方法来拦截元素的实际赋值,这样我就可以使用赋值来做一些内部的内务处理。是否有相对简洁的方法来执行此操作,还是应该创建一些访问器函数而不是使用运算符重载?
答案 0 :(得分:1)
无法拦截整数的赋值。但是,您可以返回对已重载其赋值运算符的自定义类型的引用。自定义类型可以转换为int,因此可以将其用作一个。
当然,这意味着您无法继承std::vector<int>
,而int
会返回对std::vector
的引用。您应该避免公开继承std::vector<int>*
。您的类的用户可能会通过return Unauthorized();
意外删除该对象,这将导致未定义的行为。
答案 1 :(得分:1)
AFAIK std :: vector索引运算符已经返回对该项的引用(const或非const),因此不需要继承和覆盖。
如果要拦截值的赋值,正确的方法是定义/覆盖值本身的赋值运算符(不能在向量索引运算符中执行)。那当然不适用于纯int,所以你需要将int包装在一个提供赋值运算符的类中,你可以在那里做任何你想做的事情&#34;。
修改强>
好的,我知道,所以可能需要做一些覆盖。对于反向查找,其中一种可能性可能是不将值存储在反向结构中,而是存储指向它的指针(到原始位置)。然后,原始结构中的值赋值将通过指针重定向反映出来。这还需要将自定义比较运算符传递给反向查找映射,以便不比较指针,而是比较值。
一般情况下,也可以检查boost::multi_index,这可以做到这一点 - 创建一个具有多个查找索引的单一结构。