我有std::list<T>
其中T
有一些成员函数,特别是T
的构造函数,希望让其他类知道T
的list<T>
中的地址。这样其他类可以在以后删除该节点/将其拼接到另一个列表/ etc。
在构造时,T
在列表中还没有位置,所以现在它只是给出了自己的地址(通过T::this
)。我想知道T*
是否可以转换为list<T>::iterator
,这将使标准容器操作可用于删除/转移/等。
this question似乎没有立即回答(对于列表)。我想一个解决方法是向list<T>::iterator
添加一个新的T
字段,并在知道后写入正确的值。然后,可以访问T
的类可以访问正确的迭代器。
有趣的是,似乎可以将我自己的列表节点的简单实现推送到T
。在这个模型中,T封装了自己的列表功能,因此每个T也是一个列表节点,每个T *都是一个列表迭代器。这可以解决我的问题。 (粗略的草图如下所示,感兴趣。)我没有将它构建成一个完全成熟的容器,因为它似乎是正确实现它的相当多的工作(like here)。所以我想我会使用解决方法,除非社区有任何建议?非常感谢。
/* Base class for T provides list capabilities. Usage T : node<T>. */
template< class T >
struct node
{
node<T>* next_; /* forward list. */
/* Here the value is contained *outside* the node: */
T* value() { return static_cast<T*> this; } /* uh-oh */
}
/* The iterator is essentially a convenience wrapper around node<T>*,
can define operator++() etc. */
template< class T >
struct list<T>::iterator
{
iterator( node<T>* some_node ) : node_( some_node );
iterator operator++() { return node_ = node_->next_; }
/* etc. */
node<T>* node_;
}
/* Usage: */
class Example : public node< Example >
{
/* iterator is directly constructible from node< Example >*,
and Example derives from node< Example >, so class can
construct its own iterator. */
operator list< Example >::iterator() { return this; }
/* Example's data members here as usual. */
float data1_;
}