Следующий принцип: когда я хочу вернуть коллекцию из функции, я передам итератор вывода и позволю вызывающей стороне решить, куда должен идти вывод.
Рассмотрим класс, в котором есть n
методы, и каждый из них возвращает некоторую коллекцию.Это означает, что мне нужно создать класс с n
параметрами шаблона (выходные итераторы).Число параметров шаблона начнет расти, и я не знаю, как справиться с этой проблемой.
Конкретный пример:
template<class TNode, class TEdge> class AGraph;
template<class TNode, class TEdge, class OutputOfFunc1, class OutputOfFunc2>
class APathCalculation
{
using TGraph = AGraph<TNode, TEdge>;
public:
virtual void ReturnShortestPath(size_t source, size_t dest, TGraph& graph, OutputOfFunc1 outPath) = 0;//func1
virtual void ReturnAllShortestDistances(size_t source, TGraph& graph, OutputOfFunc2 outDistances) = 0;//func2
};
И я получу различные классы (например, DijkstraБеллман-Форд) от APathCalculation
.Но проблема в том, что я ввел шаблонные аргументы
...class OutputOfFunc1, class OutputOfFunc2>
, которые я упал, что их не должно быть в определении класса, поскольку они специфичны для конкретной функции.
В настоящее время я объявляю класс какэто
// Example of declaration
APathCalculation<
int, // type of node
double, // type of edge
back_insert_iterator<list<size_t>>, // return type of shortest path between two nodes
back_insert_iterator<vector<double>> // return type of shortest distances from source node
> &pathCalculator;