我有兴趣创建一个使用队列作为其实现的一部分的函数,但我希望对队列类型进行模板化,以便它根据模板化的队列类型具有不同的功能。 / 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 3
,example<priority_queue<int>>()
打印3 2 1
,example<queue<int>>()
打印3 1 2
。这适用于stack
和priority_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。
答案 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元素。