2

我有兴趣创建一个使用队列作为其实现的一部分的函数,但我想在队列类型上进行模板化,以便它根据模板化的队列类型具有不同的功能。

这是一个基本示例:

template <typename Queue>
void example()
{
  Queue a;
  a.push(3);
  a.push(1);
  a.push(2);
  while (!a.empty()) {
    cout << a.top() << ' ';
    a.pop();
  }
  cout << flush;
}

我想要的是example<stack<int>>()打印2 1 3example<priority_queue<int>>()打印3 2 1example<queue<int>>()打印3 1 2。这适用于stackpriority_queue不幸queue的是不提供top,而是提供front. 有没有一种简单的方法可以告诉编译器何时看到topaqueue来调用front

我能想到的唯一解决方法是遵循这个问题如何为 STL 容器实现通用方法,这些容器没有使用模板模板参数的通用接口top,并为每种数据类型实现我自己的本地方法和改为调用它。不过,这个解决方案似乎非常不优雅,如果可能的话,我宁愿找到另一种方法。

编辑:我使用的编译器支持 C++11,确切地说是 gcc 4.7.0。

4

1 回答 1

7

假设 atop()front()成员的存在是互斥的,您可以创建一个合适的top()辅助函数,该函数在相应成员存在时重载:

 template <typename Queue>
 auto top(Queue const& queue) -> decltype((queue.top()))
 {
     return queue.top();
 }

 template <typename Queue>
 auto top(Queue const& queue) -> decltype((queue.front()))
 {
     return queue.front();
 }

top(a)然后,即使调用了顶部,您也可以使用访问当前顶部front()front()但是,如果队列同时具有和,这将不起作用top()。解决此问题的一个简单方法是使front()版本的选择变得不那么有吸引力,因此如果它是唯一的版本,则调用它,但如果两者都可用top(),则不调用它。front()例如:

 template <typename Queue>
 auto top(Queue const& queue, bool) -> decltype((queue.top()))
 {
     return queue.top();
 }

 template <typename Queue>
 auto top(Queue const& queue, int) -> decltype((queue.front()))
 {
     return queue.front();
 }

...然后使用 . 访问顶部元素top(a, true)

于 2013-09-14T02:41:25.780 回答