如何重载类的运算符,以便使用
的语法classInstance[index] = value;
执行
classInstance.cfgfile.Write(index,value)
背景信息;随意跳过。
我们开发的应用程序使用内存映射访问一段 NVRAM - 实际上,映射的只是两个寄存器,地址和数据。您写入地址寄存器,然后写入或读取数据寄存器。初始化后,读取和写入由保存对内存段的引用的类的简单 [] 重载执行。你引用实例的 [] 给出你想要读写的单元格的命名空间索引,它会做它的事情。
int& IndirectMemory::operator[](RTCMemIndex idx)
{
*midx_reg = idx;
return *mdata_reg;
}
(代码去除了不相关的元素,如互斥锁和健全性检查)。
一切正常...只要 NVRAM 正常工作。这个特定的芯片已经停产,那些“在野外”的芯片目前开始老化。它们的功能对我们的使用意义不大,如果芯片损坏,我们可以将它们的角色转移到闪存而几乎没有影响(只是闪存磨损多一点)。事情是我们想使用我们的配置格式的闪存记录,它使用 getter 和 setter。
int TCfgFile::ReadKey(std::string Key);
void TCfgFile::WriteKey(std::string Key,int data);
在代码的许多地方,我们通过 IndirectMemory[Some_Register] = Some_Value;
调用 NVRAM,编写各种经常更改的内容,我们希望通过重启保持不变。我想保留此语法和行为,但如果检测到 NVRAM 已损坏或通过配置条目手动禁用,则能够写入文件。
网络上充斥着使用 operator[] 仅通过返回对它的引用来设置给定值的例子。对于 example :
unsigned long operator [](int i) const {return registers[i];}
unsigned long & operator [](int i) {return registers[i];}
在这种情况下,如果我调用 reg[3] = 1;
[]
将返回对元素#3 的引用和默认的 operator=
将很好地写入引用。
但由于我无法返回对文件中键的引用(.WriteKey()
只是执行完整的写入,返回成功或错误),并且 operator=
不带索引,恐怕这个简单的选项无济于事。
最佳答案
您可以使用代理类来解决这个问题。由于 value
无法传递到 classInstance
中,我们需要创建一个 operator[]
可以返回的对象,该对象将获取 的值>value
并知道将操作应用到哪个实例。使用
struct Proxy
{
classInstance_type& to_apply;
index_type index;
Proxy(classInstance_type& to_apply, index_type index) : to_apply(to_apply), index(index) {}
Proxy& operator=(value_type const & value)
{
to_apply.cfgfile.Write(index,value)
return *this;
}
};
你类(class)的 operator[]
看起来像
Proxy operator[](index_type index)
{
return Proxy{*this, index};
}
然后当您执行 classInstance[index] = value;
时,您调用了 Proxy
的 operator=
,它引用了该对象调用、要使用的索引以及您还需要的值。
关于c++ - 如何重载运算符以在 operator[] 调用中调用 setter 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54292588/