将模板类作为参数传递

时间:2014-04-02 08:38:24

标签: c++ templates

我有两个模板类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>作为其优先级队列。我想将优先级队列的类型作为参数传递。

我该怎么做?我知道写一个抽象课是一种选择,但我并不是真的想这样做。我正在寻找其他选择。

2 个答案:

答案 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);

模板魔术由编译器完成。