将列表迭代器存储为成员

Store list iterator as member

本文关键字:成员 存储 迭代器 列表      更新时间:2023-10-16

我有一个遗留库,我目前正在现代化。

该库有一个自定义的列表类,该类在安全性和性能方面存在几个问题。

因此,我想在列表类的引擎盖下使用std::list

不幸的是,列表类的 API 在很大程度上依赖于列表中的当前位置。我不想更改该 API,因为这需要使用库在应用程序中进行大量返工和测试。

我试图将列表和具有当前位置的迭代器存储为模板化类的成员变量,但显然不可能将模板化迭代器作为成员变量。

有什么建议可以解决这个问题吗?

这是我的课

template <class T> 
class MyList
{
public:
explicit MyList(const T &t)
{
list.push_back(t);
it = list.begin();
}
int size() const { return list.size(); }
void copy(const MyList<T> &orig)
{
list = orig;
}
int insert(MyList<T> *t, MyListBASE::Location where = MyListBASE::AFTER)
{
list.insert(it, t);
return 0;
}
int insert(const T &t, MyListBASE::Location where = MyListBASE::AFTER)
{
list.insert(it, t);
return 0;
}
T *head() { return list.front(); }
T *tail() { return list.back(); }
T *current() { return it; }
T* next() { return std::next(it); }
T* prev() { return std::prev(it); }
protected:
std::list<T>::iterator it; // seems not to be possible
std::list<T> list;
};

std::list<T>::iterator是(模板参数的(依赖名称。 因此,编译器需要知道iterator是一个类型而不是一个变量:

typename std::list<T>::iterator it;

将为编译器提供足够的信息来解决问题。