可変個関数のすべての引数でstd :: forwardをどのように呼び出しますか?


114

私は単に汎用オブジェクトファクトリを作成し、ブーストプリプロセッサメタライブラリを使用して可変テンプレートを作成していました(2010を使用していて、それらをサポートしていません)。私の関数はrval参照を使用std::forwardし、完全な転送を行うため、私は考えさせられました... C ++ 0Xが出て、標準のコンパイラーがあったとき、実際の可変テンプレートでこれを行います。それでも、私std::forwardは議論を呼びかけますか?

template <typename ...Params>
void f(Params... params) // how do I say these are rvalue reference?
{
    y(std::forward(...params)); //? - I doubt this would work.
}

私が考えることができる唯一の方法は... paramsを手動で解凍することを必要とするでしょう、そして私はまだそこにもまだありません。機能するより速い構文はありますか?

回答:


161

あなたはそうするでしょう:

template <typename ...Params>
void f(Params&&... params)
{
    y(std::forward<Params>(params)...);
}

...ほとんど「左に何取ると、各テンプレートパラメータのために、それに応じて解凍します。」と言います


1
さらに、パラメーターを渡す方法を追加します。チュートリアルが示すと思いますvoid f(Params&& ...params)
UncleBens

87
私が使用する海賊の日と同じように話すvoid f(Ar&& ...arg)
ウールスター2014年

右辺値参照&&の選択の動機を説明してください(&の代わりに、または状況に応じて単に値によって)
DavidJ

@DavidJ私はモチベーションを問題に焼き込んだと思いました。ただし、次を参照してください:stackoverflow.com/questions/3582001/advantages-of-using-forward
GManNickG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.