我有一个关于循环模板引用的问题。我想使用类节点和类边制作一棵树,如下所示;
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++ 模板元编程是一种函数式语言——函数式编程中有多种技术可以用来描述无需前向声明的递归结构。
我敢打赌某种定点组合器可能会起作用,但我无法弄清楚它是如何起作用的。 :)
关于c++ - 圆形模板引用结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15330073/