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

Eri*_*rik 2 c++ stl

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

这是一个基本的例子:

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;
}
Run Code Online (Sandbox Code Playgroud)

我想要的是example<stack<int>>()打印2 1 3,example<priority_queue<int>>()打印3 2 1example<queue<int>>()打印3 1 2.这适用于stackpriority_queue,但不幸的是queue没有提供top,而是提供front.有没有一种简单的方法来告诉编译器,当它看到top一个queuefront呢?

我能想到的唯一解决方法是遵循这个问题如何使用模板模板参数为STL容器实现通用方法,该方法不需要该方法所需的通用接口,并top为每种数据类型实现我自己的本地打电话给那个.这个解决方案似乎超级优雅,如果可能的话,我宁愿找到另一种方式.

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

Die*_*ühl 7

假设a 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();
 }
Run Code Online (Sandbox Code Playgroud)

然后,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();
 }
Run Code Online (Sandbox Code Playgroud)

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