私はそうのように、多くのオーバーロードで与えられた機能を持っているファイルで働いています:私の一般的なテンプレートはTまたはT &&を使用すべきですか?
template<typename T> inline X f(T impl, W w) {
return f(impl, w->getY(), w->getZ());
}
:
inline X f(ScriptWrappable* impl, Y y, Z z) { ... }
inline X f(Node* impl, Y y, Z z) { ... }
inline X f(RawPtr<T> impl, Y y, Z z) { ... }
inline X f(const RefPtr<T>& impl, Y y, Z z) { ... }
inline X f(ScriptWrappable* impl, Y y, Z z) { ... }
inline X f(const String& impl, Y y, Z z) { ... }
inline X f(int64_t impl, Y y, Z z) { ... }
template<typename T, size_t capacity> inline X f(const Vector<T, capacity>& impl, Y y, Z z) { ... }
私はそうのように、パラメータを1つだけ必要とする新しいオーバーロードを追加しようとしています
私は上記のすべてのバリエーションが新しい2パラメータバージョンで自動的に動作するようにテンプレートを使用しています。
しかし、コードレビューでは、「T&&
はコピーを避ける方が良いですか?」と尋ねられました。つまり、代わりにする必要があります
template<typename T> inline X f(T&& impl, W w) {
return f(impl, w->getY(), w->getZ());
}
私は本当にこの質問への答えを知りません。私は普遍的な参照を理解したと思ったが、彼らが良いアイデアであるか否かに慣れていない。自分の状況を他のものよりも選ぶことの結果はどうなりますか?
私は推測していた場合、私はTのためで立つことができるオリジナルのタイプは(プリミティブ、参照、またはポインタ)T &をコピーするすべての単純なので&がはるかに利益を与えることはありませんことを言うと思います。しかし、私はまだ興味がある。どのタイプもTバージョンに渡すことができなかったT & &バージョンに渡すことができ、その逆も可能です。
呼び出し元が移動したい場合、引数を 'std :: move'するだけでよい。 'T && 'を使うことで、あなたは**彼にそれをやらせることを余儀なくされています。 'T'だけを使うことで、彼に選択肢を与えています。 –
推測されたコンテキストでテンプレートを使用している場合、これは当てはまりません –
ああ、それは分かりませんでした。説明をありがとう。 –