我有一個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<>()
函數,例如,下面的代碼。但是,現在至少有三個問題出現:
這是實現我的目標的最佳方式嗎?
如何確定類型是否是STL迭代器?我可能需要一些
#if
,併爲每個編譯器/ STL版本定製代碼以供使用。是否有可能在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
太棒了!爲了記錄,這在N3242的8.5.5中有記錄。 – Manuel