繁体   English   中英

圆形模板参考结构

[英]Circular template reference structure

我对循环模板参考有一个问题。 我想使用类节点和类边创建一个树,如下所示;

template <typename EdgeT>
class node
{
public:
    std::vector<EdgeT> edge_out;
    std::vector<EdgeT> edge_in;
};


template <typename NodeT>
class edge
{
public:
    NodeT* src;
    NodeT* dst;
    int weight;
};


template <typename NodeT, typename EdgeT>
class graph
{
public:
    std::vector<NodeT> nodes;
};

我发现我不能声明图类ex:

graph< node, edge > g; // <--- this cannot be solved 

graph< node< edge <node.....>, edge< node< edge>>  >  //it makes infinity declaration..

我怎样才能重新定义类的结构?

这是一种方法:

#include <vector>

template<template<typename NodeT,typename T>class EdgeT, typename T=double>
struct Node {
   typedef Node<EdgeT,T> self_type;
   typedef EdgeT<self_type, T> edge_type;
   std::vector<edge_type> edge_out;
   std::vector<edge_type> edge_in;
   T data;
};

template<typename NodeT,typename T>
struct Edge {
   typedef NodeT node_type;
   node_type* src;
   node_type* dst;
   int weight;
};

template<typename NodeT, typename EdgeT=typename NodeT::edge_type>
struct graph {
   typedef NodeT node_type;
   typedef EdgeT edge_type;
   std::vector<NodeT> nodes;
};

int main() {
   typedef graph< Node<Edge> > graph_type;
   graph_type my_graph;
   my_graph.nodes.push_back( graph_type::node_type() );
   my_graph.nodes.push_back( graph_type::node_type() );
   my_graph.nodes.front().edge_out.push_back( {&my_graph.nodes[0], &my_graph.nodes[1], 1} );
   my_graph.nodes.back().edge_in.push_back( {&my_graph.nodes[0], &my_graph.nodes[1], 1} );
}

对于另一种方法,您可以查看boost::variant如何处理递归变体。

另一种解决方法是更正式。 C ++模板元编程是一种函数式语言 - 函数式编程有各种技术,用于描述没有可以使用的前向声明的递归结构。

我打赌某种固定点组合器可能会起作用,但我不知道怎么做。 :)

您需要弄清楚需要使用模板的原因。 例如,如果您希望数据在边缘动态,则可以使用:

//foward declaration
template <typename T>
class node
{
std::vector<Edge<T> > edge_out;
std::vector<Edge<T> > edge_in; 
} 


template <typename T>
class edge
{
Node<T>* src;
Node<T>* dst;
T    weight
}


template <typename T>
class graph
{
std::vector<Node<T> > nodes;
}

同样,如果您希望节点中的数据不同。 但总的来说,最好事先弄清楚模板的原因。 我看过过度模板化的生产代码,这是非常难以维护的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM