我有一个C ++类Finder
,它在容器中存储一个位置以及一些额外的数据。此类容器的类型为std::string
,但char *
或MyString
。比如,类看起来像这样(Iterator<TContainer>::Type
是一个trait / metafunction,它返回给定容器的迭代器类型):
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迭代器?我可能需要一些#if
,并为每个编译器/ STL版本定制代码。
是否可以在STL中获得 nil 迭代器? 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
答案 0 :(得分:3)
Finder() : iterator() { }
应该做的伎俩。不为初始化列表中的成员提供参数将在具有一个的类型上调用默认构造函数,并将零初始化包括指针的POD类型(如果类型没有默认构造函数,它将失败,但这似乎不太可能给出你的情景)。