[英]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
我還注意到結構undirectedS
和directedS
僅在內部一個成員的布爾值上有所不同。
所以我的選項可以為我的函數聲明一個通用類型,這樣我就可以給出有向和無向的 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.