0

在 Java 中,您可以执行以下操作

List<int> myList = new ArrayList<int>();
Iterator iter = myList.Iterator();

即使 Iterator 是一个泛型/模板接口,它也不必在从另一个泛型分配时显式地指定其模板类型。它能够使用 myList<.int> 中已经存在的类型

我试图在 C++ 中建立一个类似的框架来包装 STL 库。我有以下工作。

List<int>* myList = new ArrayList<int>();
Iterator<int>* iter = myList->GetIterator();

<int>当我声明迭代器指针时,有什么办法可以摆脱?它按原样工作得很好,如果我不必每次要迭代时都抓取类型会方便得多。

我希望它看起来像这样。

List<int>* myList = new ArrayList<int>();
Iterator* iter = myList->GetIterator();

我的迭代器类看起来像这样

template <class T>
class Iterator
{
public:
    virtual boolean HasNext() = 0;
    virtual T Next() = 0;
    virtual void Remove() = 0;
};

干杯。

4

1 回答 1

1

正如 Shafik 所说,您可以使用auto,这可能是最简单的方法。另一种方式称为类型擦除。它归结为让迭代器成为一个非模板类,它有一个模板化的构造函数和一个成员变量,它是一个指向继承类的指针。有关完整说明,请参阅此内容。

为了让你开始:

class IteratorBase
{

}

template <typename T>
class IteratorDerived : IteratorBase
{
...
}


class Iterator
{
    template <typename T> Iterator(const T & _itr) : mIterator(new IteratorDerived<T>(_itr)){}

    shared_ptr<IteratorBase> mIterator;
};
于 2013-05-11T02:33:20.007 回答