3

我正在尝试实现一个混合列表,所以例如我可以这样做:

mylist* l= new mylist();
l.push_back<int> (4);
l.push_back<string> ("hello");

这是一个练习,因此不是使用其他库(如 boost)的有效解决方案。这是仍然很少有方法的类:

template <class T>
class node
{
private:

    void* next;
    void* prev;
    T data;

public:

    node(T data)
    {
        this->data=data;
    }

    template <class R>
    void link_to (node<R>& other)
    {
        next=&other;
        other.prev=this;
    }

};

因为我不知道如何管理使用 void 指针这一事实,所以我无法真正转换它的真实类所指向的数据。使用 dynamic_cast 我应该尝试所有类型(节点、节点等),所以它不是一个可接受的解决方案。因此,例如,如果我想打印一系列节点,我不能这样做:

int main(int argc, char** argv)
{
// for this example let's suppose that node fields were public
    node<int> a(1),c(2);
    node<std::string> b; 
    a.linkTo(b);
    b.linkTo(c);
    std::cout << a.data;  // this is ok but I need to print also other nodes
// let's suppose that b and c were unreachable and that I want to reach them
// by iterating into the list
    void* ptr=a.next; //public field
    cout << ptr->data; //can't do that in C++
}

整个问题是我不知道我迭代到的每个元素的类型是什么。所以下一个可以是节点或节点或节点等......但是如何解决这个问题?我将能够知道每个节点的类型,但我不能。那么如何实现混合列表呢?

4

1 回答 1

2

由于您不知道要存储哪种对象,我认为最简单的方法是将 void 指针存储到对象的已分配副本。

接下来,您将需要与对象一起存储某种类型的标签。您也许可以使用.type_info返回的对象的地址typeid

我看到其他一些我不知道如何解决的问题。要销毁列表,您需要为每个元素创建一个析构函数。当您知道类型时,也许您可​​以在元素创建期间存储析构函数的地址。

于 2012-04-19T23:57:01.483 回答