2017-10-16 12 views
4

誰かが、公共構造のすべてではなくタプルを使用してhereを提案しました。そして私はそれが有用であると感じました。しかし、私の問題は次のセクションにあります:テンプレート引数の循環依存性

using Edge = std::tuple<Node_wp,//From Node 
         Node_wp>;//To Node 
using Edge_wp = std::weak_ptr<Edge>; 

using Node = std::tuple<std::vector<Edge_wp>,//Incoming Edges 
         std::vector<Edge_wp>>;//Outgoing Edges 
using Node_wp = std::weak_ptr<Node>; 

テンプレートパラメータでこの循環依存性をどのように克服できますか。ノードタイプを知らずにタイプエッジを形成することができず、その逆もあるので、フォワード宣言(自分の知識を持っている)は機能しません。

明らかに私はそれらのうちの1つをstructとすることができます。しかし、アクセスの対称性を破ることは醜いでしょう。

+2

がリンクされ、答えを読んでいませんでしたが、私はちょうどタプルの上に構造体を好む、前提に反対します。あなたのエッジが 'Node_wp'sに接続している場合、なぜそれを宣言しないのですか?また、 'from_node'と' to_node'は 'first'と' second'よりはるかに良い名前になります。 – user463035818

+0

@ tobi303彼らは 'enum'を読みやすくすることを提案しています。しかし、ここで実際に捉えることは、すでに 'タプル'(またはタプルをサポートするライブラリ)の一部であるメンバ関数(ソート、等価、シリアライゼーションなど)を実装することではありません。 – ifyalciner

答えて

5

structとパブリック継承を使用して、循環依存関係の問題を修正できます。 Nodestd::tuple周りstructラッパーになります:

#include <memory> 
#include <tuple> 
#include <vector> 

struct Node; 
using Node_wp = std::weak_ptr<Node>; 

using Edge = std::tuple<Node_wp, // From Node 
         Node_wp>; // To Node 
using Edge_wp = std::weak_ptr<Edge>; 

struct Node : std::tuple<std::vector<Edge_wp>, // Incoming Edges 
         std::vector<Edge_wp>> // Outgoing Edges 
{ 
    using std::tuple<std::vector<Edge_wp>, std::vector<Edge_wp>>::tuple; 
}; 
+0

これは完璧です。ありがとうございました。 – ifyalciner

+0

@ifyalcinerこの回答はなぜ受け入れられましたか?これは実際に最初に提案された解決策と同じです:「明らかに私はそれらの1つを構造化することができます。 – VTT

+1

@VTT私が意味していたのは、構造体をそれ自体として使用していたことです(継承を使用して円を破ることはできませんでした)。今すぐ構造体のラッパーは、タプル上の浅いカバーです。私はタプルとして使うことができます。しかし、継承の代わりに他の提案がある場合は、私も聞きたいと思います。 – ifyalciner