Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符[]重载与恒常性_C++_Operator Overloading_Constants - Fatal编程技术网

C++ 运算符[]重载与恒常性

C++ 运算符[]重载与恒常性,c++,operator-overloading,constants,C++,Operator Overloading,Constants,在我的代码中,我创建了两个覆盖[]操作符的模板函数(构建我的STL映射版本的练习): 然后,我通过以下功能使用运算符: invokeStkCmd (my_stacks[stk_name], my_cmds[crnt_word]); 是谁的模板 invokeStkCmd (StackComp* stkPtr, const shake_cmds_t cmd) 此调用使用V&operator[](const K&key)模板(至少对于第二个参数),它可以向映射中添加一个条目,而不是我想要的其他模板

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

然后,我通过以下功能使用运算符:

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函数中执行某些操作,或者我的运算符重载函数是否不准确

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

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

这可能不会让您满意,因为它冗长且容易出错;在这种情况下,还有一种先进的方法,它利用了一个事实,即强制转换运算符重载是根据其返回类型来解决的,这与普通函数不同。我已经发布了这样的答案。请注意,要把它做好是相当困难的。

这是一个
静态转换
,而不是
常量转换
const\u cast
几乎只用于格式不正确的程序中。@KerrekSB:
static\u cast
也可用于执行该操作;在本例中,我选择了
const\u cast
,因为它更清楚地表明,转换只是改变constness——在本例中,我们从const转换为nonconst,这不会错。更重要的是,@KerrekSB:关于第二点,什么是格式错误的程序是由标准定义的,而使用
const_cast
与此无关。如果你认为只是“错误的程序”,我不同意-它有合法的用途。嗨@jpalecek,非常感谢我在演员阵容中采用了更简单的选项,而不是代理,但提到它确实打开了思路。。。
invokeStkCmd (my_stacks[stk_name], const_cast<my_map<Whatever> const&>(my_cmds)[crnt_word]);