我有一个像这样继承自 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] = c
是c
时,这将允许_pointer *
在 map 上工作。 - 您要接受的任何其他类型的赋值运算符。如果你能接受任何东西,那么
template <typename T> proxy_type & operator=(T const &);
例如。这将处理您当前尝试实现的案例。 - 可能
_pointer * operator->()
和_pointer & operator*()
如果您希望代理类型的行为就像_pointer *
当它被取消引用时。
关于不同类型的 C++ 映射赋值重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27510345/