【发布时间】:2018-03-29 00:56:33
【问题描述】:
解释
我有一个类(在示例中名为 Banana)将接收作为模板参数(在示例中名为 Q)std::queue 或 std::priority_queue。此参数所需的唯一方法是push()、pop() 和front()。现在的问题是:两个队列都有push() 和pop(),但是std::priority_queue(等效的)中的front() 方法被命名为top()。如何接口这个参数Q?
可能的解决方案
我正在考虑不同的解决方案,但这些都不能说服我。我正在编写一个 C++ 库,我不希望 dirty 解决方案会使库用户的生活变得复杂。这是我的想法:
- 创建实现
front()方法的std::priority_queue的子类。太脏了。 -
添加另一个接受如下函数的模板参数:
[] (const std::priority_queue& q) { q.top(); }或
[] (const std::queue& q) { q.front(); }取决于使用的队列类型。肮脏:使图书馆用户的生活变得复杂。
- ...
你有一款简洁优雅的吗?
例子
#include <iostream>
#include <queue>
#include <utility>
template <typename T, class Q = std::queue<T>>
class Banana
{
private:
Q queue;
public:
void push(T&& o)
{
queue.push(std::move(o));
}
const T& top()
{
return queue.front();
}
};
int main()
{
Banana<int> banana0;
banana0.push(0);
std::cout << banana0.top() << std::endl;
Banana<int, std::priority_queue<int>> banana1;
banana1.push(1);
std::cout << banana1.top() << std::endl;
return 0;
}
显然这不会编译。但我发布编译器响应以更好地解释问题:
test.cxx: In instantiation of ‘const T& Banana<T, Q>::top() [with T = int; Q = std::priority_queue<int>]’:
test.cxx:32:34: required from here
test.cxx:20:30: error: ‘class std::priority_queue<int>’ has no member named ‘front’
return queue.front();
这只是一个简化的例子。真正的问题要复杂得多。
【问题讨论】:
标签: c++ queue priority-queue interfacing