我有两个模板类FibonacciHeap和Adapter。它们都有相同的界面。
template< typename PRIO, typename VALUE, typename CMP = std::less<PRIO> >
class FibonacciHeap;
template<typename PRIO,typename VALUE >
class BinaryHeap;
我有另一个功能dijkstra
。它可以使用BinaryHeap<double,int>
或FibonacciHeap<double,int>
作为其优先级队列。我想将优先级队列的类型作为参数传递。
我该怎么做?我知道写一个抽象课是一种选择,但我并不是真的想这样做。我正在寻找其他选择。
答案 0 :(得分:2)
之前的答案在功能上很好,但有点不寻常。
通常的解决方案避免了这个论点:
template <class H> int dijkstra()
{
H heap;
}
您调用传递预期堆类型的函数。
int dist0 = dijkstra<FibonacciHeap<double,int>>();
int dist1 = dijkstra<BinaryHeap<double,int>>();
或者,使用模板模板参数:
template <template H<class, class>> int dijkstra()
{
H<double, int> heap;
}
int dist0 = dijkstra<FibonacciHeap>();
int dist1 = dijkstra<BinaryHeap>();
答案 1 :(得分:1)
让dijkstra成为模板化的功能。
template <class H>
int dijkstra(H heap)
{
// just use heap
}
你可以这样调用这个函数:
FibonacciHeap<double,int> heapFibo;
BinaryHeap<double,int> heapBina;
int dist0 = dijkstra(heapFibo);
int dist1 = dijkstra(heapBina);
模板魔术由编译器完成。