2011-05-02 305 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