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

}; 

私がvoidポインタを使用しているという事実を管理する方法がわからないので、私は本当にそれが指すデータをキャストすることはできませんが、本当のclass.Withのは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++ 
} 

全体の問題は、私は私が反復の各要素の種類何ていないということです。 次にノード、ノードまたはノードなどがありますが、どのようにこの問題を解決するのですか?私はすべてのノードのタイプを知ることができますが、私はできません。 混合リストを実装する方法は?

+2

これはあまりC++ではないだけでなく、boostは既に 'variant'と' any'で実装しています。なぜあなたは車輪を再発明しようとしていますか?おそらく、ブーストの 'variant'の実装を見ることで、複数の型をどのように同じ空間に格納するのかを見ることができます。 –

+1

@マークB:彼は学んでいる:_ "それは運動" _。 – orlp

+0

@ nightcracker:ブーストの実装を見直すよりも、ブーストの実装を見てください。 –

答えて

2

あなたはどのような種類のオブジェクトを格納しているのかわからないので、最も簡単な方法は、オブジェクトの割り当てられたコピーにvoidポインタを格納することです。

次に、オブジェクトと共にタイプタグを保存する必要があります。おそらくtypeidによって返されたtype_infoオブジェクトのアドレスを使用できます。

解決方法がわからない他のいくつかの問題があります。リストを破壊するには、各要素のデストラクタが必要です。おそらく、型を知っているときに、要素の作成中にデストラクタのアドレスを格納することができます。

+0

type_infoの使い方が分かりません。私は2つのフィールドを入れてみました: "type_info prev_type;"と "type_info next_type"が、typeid、この命令で型を取得できません: "next_type = typeid(this)"は構文エラーと見なされます。 –

関連する問題