gpt4 book ai didi

c++ - 实现混合列表,模板问题

转载 作者:太空狗 更新时间:2023-10-29 21:48:38 26 4
gpt4 key购买 nike

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

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++
}

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

最佳答案

因为您不知道要存储哪种类型的对象,我认为最简单的方法是存储指向对象的已分配拷贝的空指针。

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

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

关于c++ - 实现混合列表,模板问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10235761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com