C++ std::queue中的就地对象构造<;std::tuple<;三十、 标准::变型>&燃气轮机&燃气轮机;

C++ std::queue中的就地对象构造<;std::tuple<;三十、 标准::变型>&燃气轮机&燃气轮机;,c++,tuples,c++17,variant,C++,Tuples,C++17,Variant,我有一个C++17代码,带有一个std::queue包含std::tuples,由一个指针和一个std::variant组成。代码如下: struct EventA { int a; float b; bool c; }; struct EventB { char x; unsigned int y; }; class Window; std::queue<std::tuple<Window *, std::variant<Event

我有一个C++17代码,带有一个
std::queue
包含
std::tuple
s,由一个指针和一个
std::variant
组成。代码如下:

struct EventA
{
    int a;
    float b;
    bool c;
};

struct EventB
{
    char x;
    unsigned int y;
};

class Window;
std::queue<std::tuple<Window *, std::variant<EventA, EventB>>> eventQueue;

如果你想让事情简洁明了,你需要的是
推送
,而不是
安置
()。以及
eventQueue.emplace(nullptr,EventA{-1024,2.0f,true})有什么问题是否仍然?如果您可以将构造函数添加到事件类中,如用
对替换
元组
,那么您可以使用
事件队列()@ildjarn我的目标是避免临时对象构造、在队列中移动构造和删除临时对象。我想直接在队列中就地构造对象。@PiotrSkotnicki我想我会同意你的解决方案,即使我不喜欢编写所有事件类的琐碎构造函数,如果可能的话,我更愿意使用统一的初始化。@Jayde:你已经标记了
c++1z
,这保证了复制省略。如果您担心的是语义(而不是语法),那么,完成。
eventQueue.emplace(nullptr, -1024, 2.0f, true);
eventQueue.emplace(nullptr, 'a', 2048u);
eventQueue.emplace(nullptr, {-1024, 2.0f, true});
eventQueue.emplace(nullptr, {'a', 2048u});
eventQueue.emplace(nullptr, {std::in_place_type<EventA>, -1024, 2.0f, true});
eventQueue.emplace(nullptr, {std::in_place_type<EventB>, 'a', 2048u});
eventQueue.emplace(nullptr, std::foward_as_tuple(std::in_place_type<EventA>, -1024, 2.0f, true));
eventQueue.emplace(nullptr, std::foward_as_tuple(std::in_place_type<EventB>, 'a', 2048u));