有很多方法可以使容器(例如队列)容纳不同类型的对象。
最经典的有std::pair<void*, int>
元素,其中 element.first
是指向对象的指针,element.second
映射到对象类型。
所有这些方法(我知道)在 element.second
之后都涉及一些运行时开销(例如,在 queue.pop()
上的一些开关)找出下划线对象的类型。
我的问题是:是否有可能完全消除这种运行时开销?毕竟,对象类型在对象(指向对象的指针)被插入队列之前就已经知道了。
最佳答案
如果你静态地知道元素的类型,你可以制作一个模板化的数据存储:
#include <queue>
#include <utility>
namespace store
{
template <typename T> struct wrapper { static std::queue<T> data; };
template <typename T> std::queue<T> wrapper<T>::data;
template <typename T> void put(T const & x) { wrapper<T>::data.push(x); }
template <typename T> void put(T && x) { wrapper<T>::data.push(std::move(x)); }
template <typename T> T get()
{
T x = wrapper<T>::data.back();
wrapper<T>::data.pop();
return x;
}
template <typename T> bool empty() { return wrapper<T>::data.empty(); }
}
用法:
// push on the queue for decltype(a)
store::put(a);
// push on the Foo-queue
store::put(Foo(1, 'true', false));
// pop from the Bar-queue
if (!store::empty<Bar>()) { auto c = store::get<Bar>(); }
关于c++ - 从队列中弹出不同类型项目的运行时开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19470450/