我需要帮助理解一些C++运算符重载语句.该类声明如下:
template <class key_t, class ipdc_t>
class ipdc_map_template_t : public ipdc_lockable_t
{
...
typedef map<key_t,
ipdc_t*,
less<key_t>> map_t;
...
Run Code Online (Sandbox Code Playgroud)
该类的创建者为内部地图结构创建了一个迭代器:
struct iterator : public map_t::iterator
{
iterator() {}
iterator(const map_t::iterator & it)
: map_t::iterator(it) {}
iterator(const iterator & it)
: map_t::iterator(
*static_cast<const map_t::iterator *>(&it)) {}
operator key_t() {return ((this->operator*()).first);} // I don't understand this.
operator ipdc_t*() const {return ((this->operator*()).second);} // or this.
};
Run Code Online (Sandbox Code Playgroud)
并且begin()和end()返回地图的begin()和end():
iterator begin() {IT_ASSERT(is_owner()); return map.begin();}
iterator end() {return map.end();}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我有一个迭代器,我如何使用这些重载来获取密钥和值?
ipdc_map_template_t::iterator iter;
for( iter = my_instance.begin();
iter != my_instance.end();
++iter )
{
key_t my_key = ??????;
ipdc_t *my_value = ??????;
}
Run Code Online (Sandbox Code Playgroud)
这些是类型转换操作符,因此您可以这样做:
{
key_t key = iter;
ipdc_t *val = iter;
}
Run Code Online (Sandbox Code Playgroud)
或者,既然ipdc_map_template::iterator是它的子类std::map::iterator,你仍然可以使用原始的访问器(我觉得它更具可读性):
{
key_t key = (*iter).first;
ipdc_t *val = (*iter).second;
// or, equivalently
key_t key = iter->first;
ipdc_t *val = iter->second;
}
Run Code Online (Sandbox Code Playgroud)