1

这是我第一次真正使用可变参数模板。下面的代码没有太多用处,它只是用于学习目的,但它与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 做到这一点吗?我认为我被迫复制。如果我想这样做(并且我确实这样做了),我需要制作自己的仿函数来允许它正确吗?

4

1 回答 1

2

在函数或方法的参数列表中,参数包必须继续对象的类型,并且出现在对象名称之前。所以将相关代码改成如下:

void DeferCall(Function&& f, Args&&... args)
于 2013-03-17T19:03:05.153 回答