使用模板和优先队列的函数
Function with template and Priority Queue
我正在尝试使用 Fibonacci 堆和优先级队列编写 Dijkstra 算法。所以我有一个斐波那契堆 class(结构)
template<class T>
struct Fib {
...
};
和一个函数
template <template <class> class T>
void dijkstra(...) {
T<std::pair<double, int> > heap;
...
}
问题是:
dijkstra<Fib>(...); // OK
dijkstra<std::priority_queue>(...); // doesn't compile
为什么编译不通过,我该如何正确编写?
当您编写如下参数时:
template<class> class T
需要一个带有 单个 模板参数的 class 模板。 Fib
就是这样一个class的模板,就需要T
。但是,std::priority_queue
不采用单个模板参数。它需要三个,即使默认为两个:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
如果您使用的是 C++11,您可以简单地增强 dijkstra
以采用任意 class 模板:
template<template<class...> class T>
// ^^^
void dijkstra(...) {
或者为std::priority_queue
写一个单模板参数别名:
template <class T>
using vector_less_pq = std::priority_queue<T>;
我正在尝试使用 Fibonacci 堆和优先级队列编写 Dijkstra 算法。所以我有一个斐波那契堆 class(结构)
template<class T>
struct Fib {
...
};
和一个函数
template <template <class> class T>
void dijkstra(...) {
T<std::pair<double, int> > heap;
...
}
问题是:
dijkstra<Fib>(...); // OK
dijkstra<std::priority_queue>(...); // doesn't compile
为什么编译不通过,我该如何正确编写?
当您编写如下参数时:
template<class> class T
需要一个带有 单个 模板参数的 class 模板。 Fib
就是这样一个class的模板,就需要T
。但是,std::priority_queue
不采用单个模板参数。它需要三个,即使默认为两个:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
如果您使用的是 C++11,您可以简单地增强 dijkstra
以采用任意 class 模板:
template<template<class...> class T>
// ^^^
void dijkstra(...) {
或者为std::priority_queue
写一个单模板参数别名:
template <class T>
using vector_less_pq = std::priority_queue<T>;