使用带有adjacency_list的泛型类型

时间:2011-05-02 18:19:53

标签: c++ boost

使用Boost和一个简单的Graph项目我已经定义了两种类型的adjacency_list,一种是有方向的边,另一种是带有无向的,如下所示:

typedef adjacency_list < vecS, vertex_distributed_storage, directedS, Node > directedAdjacencyList;
typedef adjacency_list < vecS, vertex_distributed_storage, undirectedS, Node > undirectedAdjacencyList;

*此示例可以忽略Node和vertex_distributed_storage类型。

直到这里一切都没关系,但是当我尝试定义接收其中一个列表的函数时,问题出现了,因为根据图形类型,我可以有一个定向或一个无向,所以我需要指定一个泛型类型我的方法:

void loadGraph(directedAdjacencyList &graph);
void loadGraph(undirectedAdjacencyList &graph);

尽管有重复的功能做同样的事情:S

我还注意到结构undirectedSdirectedS仅在内部一个成员的bool中有所不同。

所以我的选项可以为我的函数声明一个泛型类型,所以我可以给定向和无向的adjacency_list,修改前面提到的结构中的bool或任何其他有用的想法。

感谢阅读并抱歉我的英语不好。

1 个答案:

答案 0 :(得分:1)

  

为我声明一个通用类型   功能所以我可以给两个指导   和无向的adjacency_list's

完全。或者,更确切地说,您应该有多种选择,了解您需要的通用性:

template<typename GraphT>
void loadGraph(GraphT &graph);
// or
template<typename A, typename B, typename C, typename D>
void loadGraph(adjacency_list<A, B, C, D> &graph);
// or
template<typename DirectT>
void loadGraph(adjacency_list < vecS, vertex_distributed_storage, DirectT, Node > &graph);

另请注意,在您的情况下,您可能不需要在标头中实现loadGraph,但如果您希望保留loadGraph的代码,则可以在实现文件中添加显式模板特化超出头文件:

// Header File:
template<typename GraphT>
void loadGraph(GraphT &graph);


// Implemenation File:
template<typename GraphT>
void loadGraph(GraphT &graph)
{
  // ...
}
// Explicit Template Function instantiations:
template void loadGraph(directedAdjacencyList &graph);
template void loadGraph(undirectedAdjacencyList &graph);