使用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
我还注意到结构undirectedS
和directedS
仅在内部一个成员的bool中有所不同。
所以我的选项可以为我的函数声明一个泛型类型,所以我可以给定向和无向的adjacency_list,修改前面提到的结构中的bool或任何其他有用的想法。
感谢阅读并抱歉我的英语不好。
答案 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);