2011-11-11 127 views
1

我有一個C++類Finder,它存儲容器中的位置加上一些額外的數據。這種容器的類型爲std::string,但也有char *MyString。說,類看起來像這樣(Iterator<TContainer>::Type是一種性狀/元函數,它返回迭代器類型對於給定的容器):通用迭代器/指針初始化

template <typename TContainer> 
class Finder 
{ 
public: 
    typedef typename Iterator<TContainer>::Type TIterator; 
    TIterator iterator; 

    // Initialization of iterator: How to do it generically? 

    // Finder {}      // problem with pointers! 
    // Finder() : iterator(0) {}  // problem with iterators! 
}; 

現在的主要問題是如何初始化的迭代器,其可以是指針或一個迭代。如果我只想支持我自己的容器,那麼我可以簡單地實現一個構造函數,它需要nullptr_t以下the nullptr idiom。然而,由於我想支持指針,我自己的迭代器 STL迭代器,我在這裏有點深入。

我可以想象的最好的事情是編寫一個getNil<>()函數,例如,下面的代碼。但是,現在至少有三個問題出現:

  1. 這是實現我的目標的最佳方式嗎?

  2. 如何確定類型是否是STL迭代器?我可能需要一些#if,併爲每個編譯器/ STL版本定製代碼以供使用。

  3. 是否有可能在STL中獲得迭代器? x-y的結果是否在std::vector<int> x, y; int x = x-y;定義?

代碼:

// Forward declaration. 
template <typename T> 
T getNil<T>(); 

template <typename TValue> TValue * getNil<TValue *>() 
{ return NULL; } 

template <typename TValue> TValue * const getNil<TValue * const>() 
{ return NULL; } 

template <> TValue * const getNil<MyIterator>() 
{ return MyIterator(nullptr); } // nullptr from above idiom 

template <> TStlIterator 
boost::enable_if< 
    MagicallyDetermineIfIsStlIterator<TStlIterator>::value, 
    TStlIterator> 
getNil<TStlIterator>() 
{ return MyIterator(nullptr); } // nullptr from above idiom 

回答

3
Finder() : iterator() { } 

應該做的伎倆。沒有爲初始化列表中的成員提供參數的情況下,將調用具有一個類型的默認構造函數,並且會初始化POD類型(包括指針)(如果類型沒有默認構造函數,則會失敗,但似乎不太可能你的場景)。

+0

太棒了!爲了記錄,這在N3242的8.5.5中有記錄。 – Manuel