簡體   English   中英

使用帶有 adjacency_list 的泛型類型

[英]Using a generic type with an adjacency_list

將 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僅在內部一個成員的布爾值上有所不同。

所以我的選項可以為我的函數聲明一個通用類型,這樣我就可以給出有向和無向的 adjacency_list,修改前面提到的結構內的 bool 或任何其他有效的想法。

感謝您的閱讀,並為我糟糕的英語感到抱歉。

為我的函數聲明一個泛型類型,這樣我就可以給出有向和無向的 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);

另請注意,在您的情況下,您可能不需要在 header 中實現 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM