2016-05-12 42 views
0

所以(我知道這不是完美的,它只是在問問題的目的):迭代重載成員的選擇與間接運算符

class foo : public iterator<input_iterator_tag, string> { 
    string _foo; 
    static const size_t _size = 13; 
public: 
    const string& operator*() { return _foo; } 
    const foo& operator++() { 
     _foo += '*'; 
     return *this; 
    } 
    const foo operator++(int) { 
     auto result = *this; 
     _foo += '*'; 
     return result; 
    } 
    bool operator==(const foo& rhs) { return _foo.empty() != rhs._foo.empty() && _foo.size() % _size == rhs._foo.size() % _size; } 
    bool operator!=(const foo& rhs) { return !operator==(rhs); } 
}; 

我讀到InputIterator需要定義成員選擇操作員。間接運營商是有道理的,但會員選擇運營商在這裏讓我感到困惑。如何爲foo實施會員選擇運營商?

+0

順便說一下,前綴++運算符應該返回'foo&'而不是'const foo&',否則你將無法執行'++(++ i)' - 並且它缺少'return'語句。 –

回答

1
const string* operator->() const { return &_foo; } 

用法示例:

foo i; 
++i; 
assert(i->length() == 1); 

這種工作方式是,編譯器會產生重複operator->呼叫,直到返回類型是一個原始指針(所以在這種情況下,只需一個電話到foo::operator->) ,然後對該指針執行常規成員選擇操作。

1

operator->()應該返回容器持有迭代器的類型的指針類型。因此,如果您的容器包含std::string,則iterator::operator->應返回std::sting*。在你的情況下,因爲你從std::iterator派生,所以你可以使用pointer typedef作爲返回類型。

+1

除了示例迭代器實際上模擬'const string'的容器... –

+0

@DanielSchepler我不確定這是否是OP的錯誤。他們使用'std :: string'作爲模板參數給'iterator',它使'iterator :: pointer'成爲'std :: string *',我相信這個類實際上應該將數據成員存儲爲'pointer _foo;'。 – NathanOliver