c++ - 使用带有 adjacency_list 的通用类型

标签 c++ boost

在一个简单的 Graph 项目中使用 Boost 我定义了两种类型的 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 只在一个成员的 bool 上有所不同。

所以我的选项可以为我的函数声明一个泛型类型,这样我就可以给出有向和无向的 adjacency_list,修改前面提到的结构中的 bool 或任何其他可行的想法。

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

最佳答案

declare a generic type for my functions so I can give both directed and undirected 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);

另请注意,在您的情况下,您可能不需要在 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);

关于c++ - 使用带有 adjacency_list 的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860801/

相关文章:

c++ - boost::shared_ptr 到 void * 反之亦然

c++ - 接口(interface)集合相互依赖

c++ - 在 C++ 程序中使用 ANTLR3

c++ - cvSetImageROI 检测眼睛

c++ - 在客户端使用 boost 管理 1000+ 连接

c++ - Boost Serialization - 导出多个 CPP 文件

regex - 使用 boost::regex 将反斜杠替换为双反斜杠并将双引号替换为斜杠引号

c++ - 使用额外参数 boost 变体访问者

c++ - (编码)C++ 中的字符串处理 - 问题/最佳实践?

c++ - C++ 中变量、方法等的良好命名约定是什么?