说明
我有一个类(Banana
在示例中命名),它将作为模板参数(Q
在示例中命名)接收 astd::queue
或 a std::priority_queue
。此参数所需的唯一方法是push()
,pop()
和front()
。现在的问题是:两个队列都有push()
and pop()
,但是(等效的)中的front()
方法被命名为。我如何接口这个参数?std::priority_queue
top()
Q
可能的解决方案
我正在考虑不同的解决方案,但这些都不能说服我。我正在编写一个 C++ 库,我不想要会使库用户的生活复杂化的肮脏解决方案。这是我的想法:
std::priority_queue
创建该实现front()
方法的子类。那很脏。添加另一个接受如下函数的模板参数:
[] (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();
这只是一个简化的例子。真正的问题要复杂得多。