2016-05-24 6 views
0
class ListItem 
{ 
    ListItem* GetPrev (); 
    ListItem* GetNext (); 
    // ... and many more 
}; 

class One : public ListItem 
{ 
    One* GetPrev() { return static_cast<One*>(ListItem::GetPrev()); } 
    One* GetNext() { return static_cast<One*>(ListItem::GetNext()); } 
    // ... and many more overrides 
}; 

class Two : public ListItem 
{ 
    Two* GetPrev() { return static_cast<Two*>(ListItem::GetPrev()); } 
    Two* GetNext() { return static_cast<Two*>(ListItem::GetNext()); } 
    // ... and many more overrides 
}; 

class Object : public One, public Two 
{ 
}; 

目的は、クラスObjectを2つ以上の異なるリストに挿入することです。私の質問は、どのように私は1と2をテンプレートできますか?クラスの名前もタイプとして表示されるので、これも可能ですか?私はこれをマクロでカバーしていますが、テンプレートで行うことはできますか?コード構造が少し変わっても構いませんが、マクロなしでこれを行うことはできますか?クラス定義マクロをテンプレートに置き換える

+0

['std :: list '](http://en.cppreference.com/w/cpp/container/list)が2つありますか? – Barry

答えて

0

あなたがListItemテンプレートを作ることができますを確認します。

template<class T> 
class ListItem 
{ 
    T* GetPrev (); 
    T* GetNext (); 
    // ... and many more 
}; 

class One : public ListItem<One> 

これが妙に定期的なテンプレートパターンです。

+0

驚くばかりです、それはまさに私が探していたものです。これは実際に私の心を越えましたが、許可されているかどうかわかりませんでした。 –

0

奇妙な反復テンプレートパターンを使用しても、ListItemの親を持つことができます。しかし、そのように見えなければならないだろうObjectレベルから呼び出すこと、特に...テンプレートのリストを改革するために、いくつかのstd::vectorまたはstd::list、不要の使用を検討してください:

Object o; 
One* prev = o.One::GetPrev(); 

の作業コード(http://ideone.com/dbmwFZ):

struct ListItem 
{ 
    ListItem* GetPrev (); 
    ListItem* GetNext (); 
    // ... and many more 
}; 

template <typename T> 
struct ListItemT : ListItem 
{ 
    T* GetPrev() { return static_cast<T*>(ListItem::GetPrev()); } 
    T* GetNext() { return static_cast<T*>(ListItem::GetNext()); } 
}; 

struct One : ListItemT<One> 
{ 
}; 

class Two : public ListItemT<Two> 
{ 
}; 

class Object : public One, public Two 
{ 
}; 
+0

偉大な、詳細なコードのおかげで、そのシンプルさのために他の答えを投票したが、両方の答えは素晴らしいです:) –

+0

@ user3721806それは助ける限り、問題はありません:) – Hcorg

関連する問題