如何为自定义结构体ProxyMap实现必要运算符以通过编译?
让自定义ProxyMap结构体代码编译的修改方案
当前代码编译失败有明确的原因,对应的修改方案如下:
问题代码
#include <map> #include <iostream> #include <tuple> template <typename T> struct ProxyMap { auto begin() { return m.begin(); } auto end() { return m.end(); } private: std::map<size_t, T> m; }; int main () { ProxyMap<int> pm; pm[0] = -1; pm[3] = 23; pm[63] = 0; for (auto c : pm) { size_t a; int b; std::tie(a,b) = c; std::cout << a << " " << b << "\n"; } return 0; }
必须的修改:实现operator[]重载
原代码中pm[0] = -1这类下标访问语句,无法找到ProxyMap对应的下标运算符,这是编译失败的核心原因。需要为ProxyMap添加operator[]的重载,内部直接复用成员std::map的下标逻辑:
T& operator[](size_t idx) { return m[idx]; }
可选优化:补充const版本的方法
为了让ProxyMap支持const对象的使用场景,可补充以下两个const版本的方法,属于提升可用性的优化项,非编译当前代码的必须项:
- const版本的下标运算符
- const版本的
begin()/end()迭代器方法
// const版本下标运算符 const T& operator[](size_t idx) const { return m[idx]; } // const版本迭代器方法 auto begin() const { return m.begin(); } auto end() const { return m.end(); }
修改后的完整代码
#include <map> #include <iostream> #include <tuple> template <typename T> struct ProxyMap { T& operator[](size_t idx) { return m[idx]; } const T& operator[](size_t idx) const { return m[idx]; } auto begin() { return m.begin(); } auto end() { return m.end(); } auto begin() const { return m.begin(); } auto end() const { return m.end(); } private: std::map<size_t, T> m; }; int main () { ProxyMap<int> pm; pm[0] = -1; pm[3] = 23; pm[63] = 0; for (auto c : pm) { size_t a; int b; std::tie(a,b) = c; std::cout << a << " " << b << "\n"; } return 0; }
内容的提问来源于stack exchange,提问作者Ruslan Muzhichkov
相关产品推荐
相关产品推荐

