2008-09-26 74 views
2

我需要幫助理解一些C++運算符重載語句。類聲明如下:運算符爲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; 
    ... 

類的創建者創建了一個迭代器的內部映射結構:

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. 

}; 

並開始()和結束()返回begin()和地圖的結束():

iterator begin() {IT_ASSERT(is_owner()); return map.begin();} 
iterator end() {return map.end();} 

我的問題是,如果我有一個迭代,我怎麼使用這些重載拿到鑰匙和價值?

ipdc_map_template_t::iterator iter; 
    for(iter = my_instance.begin(); 
      iter != my_instance.end(); 
     ++iter) 
    { 
     key_t my_key = ??????; 
     ipdc_t *my_value = ??????; 

    } 
+0

下面提供的解決方案是不夠好(用,但該值,PE指針問題可能),所以在不會詳細說明...但無論如何:使用隱式強制轉換作爲合成糖是壞的和危險的設計,恕我直言... – paercebal 2008-09-26 20:57:43

回答

6

這些類型轉換操作符,所以你可以這樣做:

{ 
    key_t key = iter; 
    ipdc_t *val = iter; 
} 

或者,由於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; 

} 
2

該類的創建者已經重寫了演員操作符。 所以通過將iter分配給正確類型的對象,它應該通過方法自動將自身轉換爲正確的值。

N.B.:值類型被存儲爲指針。因此,當您提取值時,您需要指定指向您在地圖界面中指定的值類型的指針。

typedef ipdc_map_template_t<int,std::string> MyMap; 
MyMap mymap; 

for(MyMap::iterator iter = mymap.begin(); 
        iter != mymap.end(); 
        ++iter) 
    { 
      int   my_key = iter; 
      std::string* my_value = iter; 

    } 

不確定我同意在這裏採取的方向。 這是否使代碼更具可讀性?我會堅持老式的地圖迭代器聽起來更有用。這個容器是在你需要的某個專業庫中定義的,還是看看boost指針容器會有好處?

+0

你能驗證你的代碼?我想你是對的,但有一件事:地圖是操縱價值的指針,而不是價值本身。所以我想用戶將不得不做「std :: string * my_value = iter;」......或者我應該去睡一下...... :-p – paercebal 2008-09-26 20:55:51

+0

只是這樣。但是當你只得到類的部分定義時,很難驗證代碼。 – 2008-09-26 20:57:18

2

operator key_t()和operator ipdc_t *()都是轉換定義。因此,考慮到在類中定義一個迭代器,你應該能夠簡單地分配您的變量:

ipdc_map_template_t::iterator iter; 
    for(iter = my_instance.begin(); 
     iter != my_instance.end(); 
     ++iter) 
    { 
      key_t my_key = iter; 
      ipdc_t my_value = iter; 
    }