C ++相互テンプレート依存関係?
-
09-12-2019 - |
質問
お互いを指す2つの構造を持ちたいのですが。具体的には、次の手順に従います。
template<typename Key, typename Value>
class MyStructure {
public:
typedef map<Key, list<pair<Value, typename ListType::iterator>>> MapType;
typedef list<typename MapType::element_type::iterator> ListType;
private:
MapType map_;
ListType list_;
}
.
ListTypeが以前にタイプとして宣言されていないため、これは動作しません。どうやってこれをすることができますか?ご覧のとおり、ITERATORタイプをこれら2つの構造体の要素へのポインタとして使用しています。
私は、不思議な繰り返しのテンプレートパターンを使うことを考えていましたが、それでどこにでも得ることができませんでした。## C ++の誰かもテンプレートエイリアスを使用して推奨されていましたが、それが失敗しました(少なくともこのアイデアの使い方がわかりません)。
私は概念的に何か悪いことをしていますか?またはおそらく「C ++の概念と並んでいません」私は確かにこれをvoid * sで行うことができましたが、私は物事を正しい方法にしようとしています:)
ありがとう!
解決
私はこれが重複するかもしれませんが(そして多くの方法では)、「歓声とhth。 - ALF」は、このようなもののための潜在的な重複の質問が一般的に一般的に属していたことを指摘しています。。
しかし、本質問では、OPは一般的に質問に記載されているシナリオでどのように包含に対処するかを知りたいのです。
これは提案です:
#include <list>
#include <map>
template <typename Key, typename Value>
class MyElement;
template <typename Key, typename Value>
class MyStructure
{
public:
typedef std::map<Key,MyElement<Key,Value> > MapType;
typedef std::list<MyElement<Key,Value> > ListType;
};
template <typename Key, typename Value>
class MyElement {
public:
typename MyStructure<Key,Value>::MapType::iterator map_iterator;
typename MyStructure<Key,Value>::ListType::iterator list_iterator;
};
.
見ているように、私はList IteratorとMap Iteratorを含む新しいデータ型typedef
を導入しました。これはTypedefではなくクラスであるため、順方向と宣言されています。
他のヒント
これはあなたがそれを表現する方法で不可能なことではありません。
その一方で、(あなたの要求を考えると)私にはストレージを元に戻すことができます。
list
のValues
を使用してから、次にマップポイントを起動しましたか?
これは巡回依存性を破るでしょう。
typedef std::list< std::pair<Key, Value> > ListType;
typedef std::multiset<typename ListType::iterator, CmpFirst> MapType;
.
(私があなたが達成しようとしていたものを本当に理解していないかどうかはわからない...)
別の解決策あなたがおそらく考慮する必要がある場合は、 boost.multiindex 。いくつかの反復/ルックアップパターンが必要な場合、Boost.MultiIndexは、ストレージを最小限に抑えるように、値内のインデックスをインタリーブするため、手作りソリューションよりも優れた代替手段です。さらに一貫性(すなわち、同じ要素のセットを参照するすべてのインデックスを有する)は与えられている。