泛型迭代器/指针初始化
Generic iterator/pointer initialization
我有一个c++类Finder
,它在容器中存储位置和一些额外的数据。这种容器有std::string
型,也有char *
型或MyString
型。例如,该类看起来像这样(Iterator<TContainer>::Type
是一个trait/元函数,它返回给定容器的迭代器类型):
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
,遵循nullptr习惯用法。但是,由于我想支持指针、我自己的迭代器和 STL迭代器,所以这里有点超出了深度。
我能想到的最好的事情是写一个getNil<>()
函数,例如下面的代码。然而,现在至少出现了三个问题:
这是实现我的目标的最好方法吗?
如何确定类型是否为STL迭代器?我可能需要一些
#if
s,并为每个编译器/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
Finder() : iterator() { }
应该可以。未在初始化列表中为成员提供参数将调用具有默认构造函数的类型的默认构造函数,并将零初始化包含指针的POD类型(如果类型没有默认构造函数,则将失败,但在您的场景中似乎不太可能)。
相关文章:
- 分段错误 - 读取初始化指针的数组
- 初始化指针的常量向量
- 初始化指针或引用成员变量以指向另一个成员
- C++初始化指针/引用/复制细微差别
- 使用无效指针初始化指针声明符的行为是否未定义?
- 在一行中初始化指针(新uint8_t[高度*宽度*3])
- 如何使用可变模板初始化指针?
- 初始化指针时出现写入访问冲突
- C 错误,带有卷曲括号的字面初始化指针
- 重新初始化指针是一种不好的做法吗?
- 初始化指针?C
- 初始化指针向量的向量
- 如何在类函数中正确初始化指针
- C++初始化指针会使应用程序随机崩溃
- 初始化指针结构 - 内存中的外观
- 如何使用struct构造函数在结构中初始化指针阵列
- 在一行中声明并初始化指针到类实例
- 分配数组与初始化指针
- QT 中的非初始化指针
- 使用地址值初始化指针