2012-04-19 5 views
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; 
    } 

}; 

내가 무효 포인터를 사용하여, 난 정말 그것을 가리키는 데이터를 전송할 수없는 사실을 관리하는 방법을 모르기 때문에

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

전체 문제는 내가가 반복 모든 요소의 종류 아니에요 일을 할 것입니다 : 그래서 예를 들어 나는 그것을 할 수있는 노드의 시리즈를 인쇄하려면. 다음으로 노드 또는 노드 또는 노드 등이 될 수 있지만이 문제를 해결하는 방법은 무엇입니까? 모든 노드의 유형을 알 수는 있지만 그럴 수는 없습니다. 다음 혼합 목록을 구현하는 방법은 무엇입니까?

+2

이것은 매우 C++이 아닙니다 - 관용적이지만 boost는 이미 'variant'와'any'로 구현했습니다. 왜 바퀴를 재발 명하려고합니까? 아마도 가장 좋은 곳은 부스트의 'variant'구현을 보면 동일한 공간에 여러 유형을 저장하는 방법을 볼 수 있습니다. –

+1

@ 마크 B : 그는 배우고있다 : _ "운동이다"_. – orlp

+0

@nightcracker : 그러면 그는 우리에게 그것을 재발견하도록 요구하기보다는 Boost의 구현을 관찰해야합니다. –

답변

2

당신이 어떤 종류의 객체를 저장하는지 알지 못하기 때문에 가장 쉬운 방법은 객체의 할당 된 복사본에 void 포인터를 저장하는 것입니다.

다음으로 개체와 함께 일종의 형식 태그를 저장해야합니다. typeid에 의해 반환 된 type_info 개체의 주소를 사용할 수도 있습니다.

내가 해결 방법을 모른다는 다른 문제가 있습니다. 리스트를 파괴하려면 각 원소에 대한 소멸자가 필요합니다. 아마도 유형을 알고있을 때 요소 생성 중에 소멸자의 주소를 저장할 수 있습니다.

+0

type_info를 사용하는 방법을 모르겠다. 두 필드를 넣으려고했습니다 : "type_info prev_type;" 및 "type_info next_type"있지만 typeid,이 명령 사용하여 형식을 가져올 수 없습니다 : "next_type = typeid (this)"구문 오류로 간주됩니다. –