2015-11-07 79 views
3

我有一個自定義的迭代器實現(它遍歷數據庫查詢結果,但這是無關的)。它在概念上具有2組功能:get類型函數(返回當前項目(當前行)的值)和setup類型函數(在本例中爲bind s),它在開始迭代之前設置迭代器,因此a新的迭代器實例實際上並未指向第一個項目。還有一個reset函數可以使迭代器和readys的設置不同。自動初始化和const正確性

當調用其中一個get函數時,它首先檢查迭代器是否仍然是新的或已被重置(有效地指向begin()-1),如果是,則將其推進到第一個項目。 get功能將(應)爲const,除了有條件的第一次提前防止這種情況。

我應該:

  1. 聲明它們const並在mutable拋出的isReset標誌,或
  2. 保留原樣,並接受在引擎蓋初始化對象使其成爲事實非const
  3. 將自我初始化替換爲初始化狀態的檢查,並留給用戶在調用任何get函數之前調用operator++一次?
+0

沒有'get ...'被調用的新迭代器可以等於'end()'? – 6502

回答

2

您的迭代器具有狀態(即底層數據是否可用),「get」函數會更改該狀態。因此,它就像任何其他迭代器一樣。 「get」函數不應該是const。順便說一句,不是調用你的函數「get」,而是讓迭代器與標準庫迭代器具有相同的接口會更好 - 那麼你可以使用它的標準算法。所以使用運算符*()和運算符++()等函數。

+0

我確實使用了運算符++()。至於操作符*(),get函數也需要一個列參數,對於獲取不同類型(getInt(),getString()等)有不同的方法,所以並不那麼簡單。 – baruch

+0

我明白你對不同類型的get的觀點。我想知道運算符*()是否最好返回某種具有必要get *(n)函數的「Record」或「Row」類。 –

+0

你可能想看看其他人如何解決這個問題。例如sqlpp11 - https://github.com/rbock/sqlpp11 –