c++ - 从队列中弹出不同类型项目的运行时开销

标签 c++

有很多方法可以使容器(例如队列)容纳不同类型的对象。 最经典的有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/

相关文章:

c++ - 如何创建具有 CUDA 支持的最新 Tensorflow 版本的调试版本?

c++ - 用于捕获 10 Gbps NIC 的 libpcap

c++ - opencv 立体校准 -> 将相机图像 A 变形为相机图像 B

c++ - gpuocelot llvm/程序集/Parser.h : No such file or directory

C++ STL 映射无法识别 key

C++ : Read random line from text file

指针函数/const 指针函数的 C++ 模板部分特化没有区别吗?

c++ - 初学者有什么实际使用的好项目

c++ - 如何将值列表传递给需要数组的函数?

c++ - 有效检查包装在 `std::pair` s 中的对象集合的属性