Моя проблема заключается в следующем.Я изучаю C ++, написав библиотеку графов, и хочу использовать как можно больше общих методов программирования;следовательно, ответ на мой вопрос через «use BOOST» мне не поможет;на самом деле, я пытался просмотреть код BOOST, чтобы найти ответ на мой вопрос, но это был унизительный опыт, поскольку я даже не могу понять, где определены определенные функции;слишком высокий уровень C ++, чтобы учиться на нем на моем уровне.
Тем не менее, моя библиотека настроена следующим образом:
class edge { ... };
template <class edge_T>
class node { ... };
template <class edge_T, class node_T>
class graph { ... };
, и я создаю более сложные графы с помощьюиспользуя классы, полученные из ребра или узла, таким образом, класс взвешенного ребра был бы просто
template <class T>
class weighted_edge : public edge {
public:
T weight;
...
};
Теперь проблема заключается в том, что я хочу реализовать алгоритм для этой структуры, который вычисляет кратчайшее расстояние между двумя вершинами.Я мог бы легко написать два из них, один для взвешенных ребер и один для невзвешенного, но изменение крошечное: один получит доступ к полю члена weighted_edge
(или производным классам), а другой примет унитарный вес.
Есть ли способ сделать это, чтобы я мог иметь только один кусок кода для обоих случаев?
Одним из решений является использование функции-члена edge::get_weight()
, которая бы возвращала вес (или '1'в невзвешенном случае), но это заставило бы меня использовать определенный тип веса для класса ребра, который является невзвешенным, поэтому пахнет смешно.Я имею в виду, что шаблон должен быть
template <class T>
class edge {
public:
...
virtual T get_weight(void) { return T(1); }
}
, что не совсем удобно для пользователя или, по крайней мере, сбивает с толку, так как вы не ожидаете, что должны быть какие-либо веса.
BGL использует функцию get()
для получения веса;Я мог бы написать функцию, которая возвращает 1 или weight
в зависимости от edge_T
, но меня беспокоит, что произойдет, если получить из edge
или weighted_edge
?Если кто-то напишет:
template <class T>
inline T get_weight(edge & e) { return T(1); }
template <class T>
inline T get_weight(weighted_edge & e) { return T(e.weight); }
, что произойдет, если вы передадите производный класс?Существует ли механизм C ++, который бы выбирал из этих двух «более близкий» базовый класс?