operator []重载和常量

时间:2012-06-24 18:54:16

标签: c++ operator-overloading const

在我的代码中,我创建了两个覆盖[]运算符的模板函数(一个用于构建我的STL映射版本的练习):

const V& operator[](const K& key) const;    // X = map["kuku"]

V& operator[](const K& key);                // map["kuku"] = x
然后我通过以下函数使用运算符:

invokeStkCmd (my_stacks[stk_name], my_cmds[crnt_word]);

其模板为

invokeStkCmd (StackComp* stkPtr, const shake_cmds_t cmd)

此调用使用V& operator[](const K& key)模板(至少对于第二个参数),该模板可以向地图添加条目而不是我想要的其他模板。在Stack Overflow中引用最近的操作符重载帖子,看来我的opertaor重载模板函数没问题。我是否需要在我的invokeStkCmd函数中执行某些操作,或者我的运算符重载函数究竟不准确?

1 个答案:

答案 0 :(得分:0)

当处理行为在要修改时大不相同的对象时,这是一个常见问题。它是由一个简单的事实引起的,即仅基于参数类型而不是返回类型或使用返回值来解决重载。因此,最简单的解决方案是在索引发生之前使用const_cast制作地图对象const

invokeStkCmd (my_stacks[stk_name], const_cast<my_map<Whatever> const&>(my_cmds)[crnt_word]);

这可能不会让你满意,因为它的冗长和容易出错;在这种情况下,还有一种先进的方法,利用铸造操作符重载根据其返回类型解决的事实,与普通函数不同。我已经发布了这样的答案here。请注意,要做到这一点非常困难。