2017-10-16 11 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>; 

템플릿 매개 변수에서이 순환 종속성을 어떻게 극복 할 수 있습니까? Edge 노드는 노드 유형을 알지 못해서 형성 될 수 없기 때문에 Forward 선언 (소유하고있는 지식으로)은 작동하지 않습니다.

분명히 나는 ​​그들 중 하나를 struct로 만들 수 있습니다. 그러나 접근에서 대칭을 깨뜨리는 것은 추악 할 것이다.

+2

링크 된 답을 읽어 didnt는하지만, 난 그냥 튜플을 통해 구조체를 선호 전제에 동의하지 않는다. 가장자리가'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이 답변이 왜 받아 들여 졌습니까? 이것은 실제로 처음 제안 된 솔루션과 동일합니다. "분명히 그 중 하나를 구조화 할 수 있습니다." – VTT

+1

@VTT 나는 구조체를 자체적으로 사용한다는 것을 의미했습니다 (상속을 사용하여 상속을 생각할 수는 없습니다). 이제 struct 래퍼는 튜플을 덮는 얕은 커버 일뿐입니다. 그리고 튜플로 사용할 수 있습니다. 그러나 상속 대신에 다른 제안이 있다면 나는 또한 듣고 싶습니다. – ifyalciner