Использование универсального типа с adjacency_list - PullRequest
1 голос
/ 02 мая 2011

Используя 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

Я также заметил, что struct undirectedS и directedS отличаются тольков bool одного члена внутри.

Таким образом, мои параметры могут быть объявлены универсальным типом для моих функций, чтобы я мог давать как направленный, так и ненаправленный список adjacency_list, изменять bool внутри упомянутой структуры или любую другую идею, которая работает.

Спасибо за чтение и извините за мой плохой английский.

1 Ответ

1 голос
/ 02 мая 2011

объявить универсальный тип для моего функции, чтобы я мог дать как направленный и неориентированные списки смежности

Точно. Или, если быть более точным, у вас должно быть несколько вариантов того, насколько универсальным должен быть ваш ответ:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...