これは、可変個引数テンプレートで実際に遊んだ最初のショットです。次のコードはあまり役に立ちません。学習目的のためだけですが、類似点を共有しています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
ラムダに値によって格納されることを意図していますが、それらは取り込まれているため、DeferCall
理論的にはstd::forward
ed になる可能性があり、終了する可能性がありますコピーされるか、移動される可能性があります。ラムダでこれを行う方法はないと思いますか?私は思うにコピーを余儀なくされています。私がこれをやりたいのなら(そして私はそうしています)、それを可能にする独自のファンクターを作る必要がありますか?