我正在Windows 8上使用Visual Studio 2012,并尝试为std::queue创建包装器,以增加线程安全性和其他一些功能。我在为Emplace创建包装函数时遇到麻烦。我怀疑这是由于可变参数模板的仿真方式引起的,但是我不确定如何解决它。
template <typename T>
class MyQueue
{
public:
template <class... Args> // line 20
void emplace(Args&&... args)
{
mQueue.emplace(std::forward<Args>(args)...);
}
private:
std::queue<T> mQueue;
};
这段代码给了我很多语法错误。
@第20行:
@第21行:
有什么干净的方法可以利用底层队列的
emplace
函数?我对性能没有任何影响,因此,如果最终遇到的麻烦超过了值得的程度,我将迫使调用者使用push
。任何解决方案都必须使用VC++ 11-切换平台或编译器不是我的选择。
最佳答案
我最终通过在项目设置中将Platform Toolset更改为2012年11月CTP来使它起作用。正如其他人指出的那样,代码本身是正确的。请参见下面的简单示例。
MyQueue.h:
#pragma once
#include <queue>
template <typename T>
class MyQueue
{
public:
template <class... Args>
void emplace(Args&&... args);
private:
std::queue<T> mQueue;
};
template <typename T>
template <class... Args>
void MyQueue<T>::emplace(Args&&... args)
{
mQueue.emplace(std::forward<Args>(args)...);
}
Main.cpp
#include "MyQueue.h"
struct Test
{
int mA, mB;
Test(int a, int b) : mA(a), mB(b) { }
};
int main()
{
MyQueue<Test> q;
q.emplace(1, 1);
q.emplace(2, 2);
q.emplace(3, 3);
return 0;
}
关于c++ - std::queue emplace的包装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15604412/