C++14中如何重载下标赋值运算符实现类型转换存储?
实现对外/内部异构类型的数组下标读写支持
要解决operator[]无法同时支持读取和赋值的问题,核心是用代理类作为下标运算符的返回值。代理类会持有内部数组的引用和目标索引,在赋值时自动执行向下转换,读取时自动执行向上转换,完全兼容现有arr[i]的读写语法。
修改后的完整代码
// 模拟实际业务中的上下转换函数 int8_t complex_downcast(double x) { return static_cast<int8_t>(x); } double complex_upcast(int8_t x) { return static_cast<double>(x); } template <typename T, unsigned int N> struct buffer { // 内部存储数组 int8_t v[N]; // 代理类:处理下标读写的转换逻辑 struct Proxy { buffer& parent; int index; // 赋值操作:将外部类型T转换为内部存储类型int8_t Proxy& operator=(const T& value) { parent.v[index] = complex_downcast(value); return *this; } // 读取操作:隐式转换为外部类型T operator T() const { return complex_upcast(parent.v[index]); } }; // 非const对象的下标运算符:返回代理,支持读写 Proxy operator[](int i) { return Proxy{*this, i}; } // const对象的下标运算符:仅支持读取,直接返回转换后的外部类型 T operator[](int i) const { return complex_upcast(v[i]); } }; #include <iostream> int main() { buffer<double, 1> buf; buf[0] = 2.1; // 自动执行complex_downcast,存储为int8_t的2 std::cout << buf[0] << std::endl; // 自动执行complex_upcast,输出2.0 // const对象测试 const buffer<double, 1>& const_buf = buf; std::cout << const_buf[0] << std::endl; // 仅可读,输出2.0 }
关键逻辑说明
- 代理类Proxy:
- 持有buffer的引用和目标索引,确保能直接操作内部数组。
- 重载
operator=:接收外部类型T的值,调用complex_downcast转换后写入内部存储。 - 重载隐式转换运算符
operator T():读取时自动调用complex_upcast,将内部存储的int8_t转为外部类型T。
- buffer的operator[]:
- 非const版本返回Proxy对象,支持赋值和读取操作。
- const版本直接返回转换后的
T,保证const对象的只读语义。
这种方案完全不需要修改现有交互代码,直接替换原有的set方法调用为arr[i] = value即可,同时保留读取时的arr[i]语法。
内容的提问来源于stack exchange,提问作者calad0i
相关产品推荐
相关产品推荐

