내가 예를 들어 나는이 할 수있을 것이다, 그래서 혼합 목록을 구현하기 위해 노력하고 있어요와 문제 :구현 혼합 목록, 템플릿
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;
}
};
내가 무효 포인터를 사용하여, 난 정말 그것을 가리키는 데이터를 전송할 수없는 사실을 관리하는 방법을 모르기 때문에
실제 class.With의 dynamic_cast는의 I입니다 모든 유형 (노드, 노드, 등등 ...)을 시도해야하므로 수용할만한 해결책이 아닙니다.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++
}
전체 문제는 내가가 반복 모든 요소의 종류 아니에요 일을 할 것입니다 : 그래서 예를 들어 나는 그것을 할 수있는 노드의 시리즈를 인쇄하려면. 다음으로 노드 또는 노드 또는 노드 등이 될 수 있지만이 문제를 해결하는 방법은 무엇입니까? 모든 노드의 유형을 알 수는 있지만 그럴 수는 없습니다. 다음 혼합 목록을 구현하는 방법은 무엇입니까?
이것은 매우 C++이 아닙니다 - 관용적이지만 boost는 이미 'variant'와'any'로 구현했습니다. 왜 바퀴를 재발 명하려고합니까? 아마도 가장 좋은 곳은 부스트의 'variant'구현을 보면 동일한 공간에 여러 유형을 저장하는 방법을 볼 수 있습니다. –
@ 마크 B : 그는 배우고있다 : _ "운동이다"_. – orlp
@nightcracker : 그러면 그는 우리에게 그것을 재발견하도록 요구하기보다는 Boost의 구현을 관찰해야합니다. –