の問題を混合リストを実装:私はこれを行うことができるだろう例えばので、混合リストを実装しようとしています、テンプレート
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++
}
全体の問題は、私は私が反復の各要素の種類何ていないということです。 次にノード、ノードまたはノードなどがありますが、どのようにこの問題を解決するのですか?私はすべてのノードのタイプを知ることができますが、私はできません。 混合リストを実装する方法は?
これはあまりC++ではないだけでなく、boostは既に 'variant'と' any'で実装しています。なぜあなたは車輪を再発明しようとしていますか?おそらく、ブーストの 'variant'の実装を見ることで、複数の型をどのように同じ空間に格納するのかを見ることができます。 –
@マークB:彼は学んでいる:_ "それは運動" _。 – orlp
@ nightcracker:ブーストの実装を見直すよりも、ブーストの実装を見てください。 –