不同类型的 C++ 映射赋值重载

标签 c++ operator-overloading overloading unordered-map

我有一个像这样继承自 unordered_map 的自定义类:

class _map : public unordered_map<string, _pointer> {
    public:
    // STUFF ...
};

让我们假设 _pointer是另一个自定义类,它的作用是帮助我处理指针的东西。 _pointer s 可以由许多不同的预定义类型构造,例如:

vector<...> v;
_pointer p = _pointer(v);
// p is now a _pointer holding v and vector<...> data

现在,如果我想存储 vector <...> _pointer在我的 map 上,我可以简单地做:

_map map;
vector<...> v;
map["a_vector"] = _pointer(v);

它有效,但我希望能够改为这样做:

_map map;
vector<...> v;
map["a_vector"] = v;

并将其分配为 _pointer(v)自动地,也许通过重载 map 如何分配东西并明确告诉它处理 vector<...>通过调用特定的 _pointer构造函数。

我已尝试这样做(通过重载 operator[]、operator=),但我似乎无所作为。谁能建议我实现这种行为的方法?

谢谢。

常见问题解答:

Q: Why are you using _ on identifier names? Don't you know that's bad practice?
A: It doesn't matter for the issue at hand.

Q: Your code is not RAII.
A: So, what?

Q: Why are you not using unique_ptr/smart_ptr? Why are you dealing with pointers directly?
A: Because I need to and that also doesn't matter for the issue at hand.

Q: Why are you overloading unordered_map? Why don't you use this _OTHER_OPTION_?
A: No thanks, this is what I need to do.

最佳答案

没有一种完全直接的方法可以通过重载 operator[] 来做到这一点独自的。让我解释一下原因。

a[b] = c;什么时候a属于重载 operator[] 的类型相当于说a.operator[](b) = c; .请注意,运算符(operator)不知道 c , 也不是它的类型。在典型的标准库容器中,operator[]返回 value_type & .这允许赋值语法,因为引用是左值。您所做的只是为容器中已存在的对象分配一个新值。

应该清楚为什么你不能合理地重载operator[]做你想做的事:你不能根据返回值重载,这是各种 operator[]唯一方式重载会有所不同,因为大概它们都需要采用 string作为论点。

即使您尝试将运算符实现为 template <typename T> T & operator[](string key);您仍然会有问题,因为类型推导不适用于返回类型。你必须写出 a.operator[]<decltype(c)>(b) = c;这太讨厌了。

话虽如此,有一个选项有点老套,但可行:让你的 operator[]返回一个代理对象,类似于 std::vector<bool>::operator[]() 采取的方法.代理类型需要:

  • operator _pointer *&() (和 operator _pointer *() const )以便它可以在需要 _pointer * 的上下文中使用. (这些是隐式转换运算符。)
  • proxy_type & operator=(_pointer *)这样就可以直接分配一个新值。 (当 a[b] = cc 时,这将允许 _pointer * 在 map 上工作。
  • 您要接受的任何其他类型的赋值运算符。如果你能接受任何东西,那么template <typename T> proxy_type & operator=(T const &);例如。这将处理您当前尝试实现的案例。
  • 可能 _pointer * operator->()_pointer & operator*()如果您希望代理类型的行为就像 _pointer *当它被取消引用时。

关于不同类型的 C++ 映射赋值重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27510345/

相关文章:

c++ - 如何使用 Qt 从文件中读取 UTF-8 文本?

c# - 无法在 DLL 中找到入口点

c++ - 为什么数组从 0 而不是 1 开始? (C, C++)

c++ - 我可以在 C++ 中创建强类型整数吗?

c++ - 构造线程时调用的运算符重载函数

c++ - 将抽象仿函数分配给 std::function - 为什么 std::ref 是一个解决方案?

c++ - 用友元类重载构造函数

c++ - constexpr 的推导类型是什么?

c++ - 为什么在初始化元素多于数组大小时的数组容器时不会出现错误?

c++ - 枚举作为非类型函数模板参数应该彼此不同吗?