【问题标题】:Generic iterator/pointer initialization通用迭代器/指针初始化
【发布时间】: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&lt;&gt;() 函数,例如下面的代码。但是,现在至少出现了三个问题:

  1. 这是实现我的目标的最佳方式吗?

  2. 如何判断一个类型是否为STL迭代器?我可能需要一些#ifs,并为每个要使用的编译器/STL 版本定制代码。

  3. 是否有可能在 STL 中获得 nil 迭代器? std::vector&lt;int&gt; 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


    【解决方案1】:
    Finder() : iterator() { }
    

    应该做的伎俩。不为初始化列表中的成员提供参数将调用具有 1 的类型的默认构造函数,并将包括指针在内的 POD 类型初始化为零(如果该类型没有默认构造函数,它将失败,但这似乎不太可能你的场景)。

    【讨论】:

    • 太棒了!作为记录,这记录在 N3242 的 8.5.5 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多