这是我第一次真正使用可变参数模板。下面的代码没有太多用处,它只是用于学习目的,但它与std::async
(这是我打算实现的)有相似之处。
std::queue<std::function<void()>> functions;
template<typename Function, typename... Args>
void DeferCall(Function&& f, Args&& args...)
{
functions.push([=]{ f(args...); });
}
void func(int x, int y)
{
std::cout << x << ' ' << y << '\n';
}
int main()
{
DeferCall(func, 1, 2);
DeferCall([]{ func(6, 7); });
while(!functions.empty())
{
functions.front()();
functions.pop();
}
}
我正在'Args' : parameter pack must be expanded in this context
签名DeferCall
。
除了想知道如何使上述工作总体上正常工作之外,我还有一个关于如何改进的问题:f
并且args
旨在按值存储在 lambda 中,但是由于它们被纳入DeferCall
,因此理论上可以被std::forward
编辑,这可能会结束被复制或可能最终被移动。我认为没有任何方法可以用 lambda 做到这一点吗?我认为我被迫复制。如果我想这样做(并且我确实这样做了),我需要制作自己的仿函数来允许它正确吗?