2011-05-02 242 views
1

使用升压用一个简单的图形项目中,我定义了两个类型的adjacency_list的,一个有向边和其他与无向那些像这样的的adjacency_list:使用泛型类型

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

*节点和vertex_distributed_storage这个例子中的类型可以被忽略。

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

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

尽管有功能重复做同样的东西:S

我也注意到,结构undirectedSdirectedS只在里面一个成员的布尔不同。

所以我的选项可以为我的函数声明一个泛型类型,所以我可以提供定向和无向adjacency_list的,修改之前提到的结构内的bool或任何其他工作原理。

感谢您的阅读和抱歉,我的英语不好。

回答

1

声明泛型类型,我 功能,这样我就可以给双方直接 和非定向的adjacency_list的

没错。或者,更准确地说,你应该有你需要如何通用的,几个选项:

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); 
+0

非常感谢您的回答,我会尽快检查我可以^^ – Aballano 2011-05-04 07:17:22

+0

@Shyish:请注意,您可以对答案进行投票,并且可以将答案标记为已接受。 :-) – 2011-05-04 09:01:35

+0

谢谢!它工作完美=)(现在我有类似的麻烦'typedef property_map ::类型vertexNameMap;'但我会尝试找出它之前发布= P) – Aballano 2011-05-06 19:40:23