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

上記の作業を一般的に行う方法について疑問に思っていることに加えて、これをどのように改善できるかについて質問がありますfargsラムダに値によって格納されることを意図していますが、それらは取り込まれているため、DeferCall理論的にはstd::forwarded になる可能性があり、終了する可能性がありますコピーされるか、移動される可能性があります。ラムダでこれを行う方法はないと思いますか?私は思うにコピーを余儀なくされています。私がこれをやりたいのなら(そして私はそうしています)、それを可能にする独自のファンクターを作る必要がありますか?

4

1 に答える 1

2

関数またはメソッドのパラメーター リストでは、パラメーター パックはオブジェクトの型の前に配置し、オブジェクトの名前の前に配置する必要があります。したがって、関連するコードを次のように変更します。

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