template <typename T_graph, typename T_label>
struct vertex_tmpl {
typedef typename T_graph::edge_t edge_t;
edge_t* edge;
// .... maybe some more edges ....
};
template <typename T_graph, typename T_weight>
struct edge_tmpl {
typedef typename T_graph::vertex_t vertex_t;
vertex_t* vertex;
};
template < template <typename, typename> class T_vertex,
template <typename, typename> class T_edge,
typename T_weight = int,
typename T_label = int >
struct graph_tmpl {
typedef graph_tmpl< T_vertex, T_edge> self_t;
typedef T_vertex<self_t, T_label> vertex_t;
typedef T_edge<self_t, T_weight> edge_t;
};
int main() {
typedef graph_tmpl< vertex_tmpl, edge_tmpl> graph_t;
typedef typename graph_t::edge_t basic_edge;
typedef typename graph_t::vertex_t basic_vertex;
basic_edge edge;
basic_vertex vertex;
vertex.edge = &edge;
edge.vertex = &vertex;
}
dGVtcGxhdGUgPHR5cGVuYW1lIFRfZ3JhcGgsIHR5cGVuYW1lIFRfbGFiZWw+CnN0cnVjdCB2ZXJ0ZXhfdG1wbCB7CiAgICB0eXBlZGVmIHR5cGVuYW1lIFRfZ3JhcGg6OmVkZ2VfdCBlZGdlX3Q7CiAgICBlZGdlX3QqIGVkZ2U7CiAgICAvLyAuLi4uIG1heWJlIHNvbWUgbW9yZSBlZGdlcyAuLi4uCn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVF9ncmFwaCwgdHlwZW5hbWUgVF93ZWlnaHQ+CnN0cnVjdCBlZGdlX3RtcGwgewogICAgdHlwZWRlZiB0eXBlbmFtZSBUX2dyYXBoOjp2ZXJ0ZXhfdCB2ZXJ0ZXhfdDsKICAgIHZlcnRleF90KiB2ZXJ0ZXg7Cn07Cgp0ZW1wbGF0ZSA8IHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIFRfdmVydGV4LAogICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWU+IGNsYXNzIFRfZWRnZSwKICAgICAgICAgICB0eXBlbmFtZSBUX3dlaWdodCA9IGludCwKICAgICAgICAgICB0eXBlbmFtZSBUX2xhYmVsID0gaW50ID4Kc3RydWN0IGdyYXBoX3RtcGwgewogICAgdHlwZWRlZiBncmFwaF90bXBsPCBUX3ZlcnRleCwgVF9lZGdlPiBzZWxmX3Q7CiAgICB0eXBlZGVmIFRfdmVydGV4PHNlbGZfdCwgVF9sYWJlbD4gdmVydGV4X3Q7CiAgICB0eXBlZGVmIFRfZWRnZTxzZWxmX3QsIFRfd2VpZ2h0PiBlZGdlX3Q7Cn07CgppbnQgbWFpbigpIHsKICAgIHR5cGVkZWYgZ3JhcGhfdG1wbDwgdmVydGV4X3RtcGwsIGVkZ2VfdG1wbD4gZ3JhcGhfdDsKICAgIHR5cGVkZWYgdHlwZW5hbWUgZ3JhcGhfdDo6ZWRnZV90IGJhc2ljX2VkZ2U7CiAgICB0eXBlZGVmIHR5cGVuYW1lIGdyYXBoX3Q6OnZlcnRleF90IGJhc2ljX3ZlcnRleDsKCiAgICBiYXNpY19lZGdlIGVkZ2U7CiAgICBiYXNpY192ZXJ0ZXggdmVydGV4OwogICAgdmVydGV4LmVkZ2UgPSAmZWRnZTsKICAgIGVkZ2UudmVydGV4ID0gJnZlcnRleDsKfQ==