修改标准STL容器以支持通用队列接口

时间:2013-09-14 02:17:53

标签: c++ stl

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

这是一个基本的例子:

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。是否有一种简单的方法可以告诉编译器何时在top上看到queue来调用front

我能想到的唯一解决方法是关注此问题How to implement generic method for STL containers that haven`t common interface needed for that method using template template parameter,并为每种数据类型实现我自己的本地top并调用它。这个解决方案似乎超级优雅,如果可能的话,我宁愿找到另一种方式。

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

1 个答案:

答案 0 :(得分:7)

假设top()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)访问top元素。