【发布时间】:2011-11-11 10:42:52
【问题描述】:
我有一个 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!
};
现在的主要问题是如何初始化可以是指针或迭代器的迭代器。如果我只想支持我自己的容器,那么我可以简单地实现一个构造函数,它在the nullptr idiom 之后采用nullptr_t。但是,由于我想支持指针,我自己的迭代器 和 STL 迭代器,我这里有点不够深入。
我能想到的最好的事情就是写一个getNil<>() 函数,例如下面的代码。但是,现在至少出现了三个问题:
这是实现我的目标的最佳方式吗?
如何判断一个类型是否为STL迭代器?我可能需要一些
#ifs,并为每个要使用的编译器/STL 版本定制代码。是否有可能在 STL 中获得 nil 迭代器?
std::vector<int> x, y; int x = x-y;中的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
【问题讨论】:
标签: c++ iterator generic-programming