4.3可変テンプレートの適用
4.3 可変パラメーターテンプレートの適用
Variadicテンプレートは、C ++標準ライブラリなどの汎用ライブラリを実装するときに重要な役割を果たします。
可変パラメーターテンプレートは、共通ライブラリ(C ++標準ライブラリなど)の実装において非常に重要な役割を果たします。
典型的なアプリケーションの1つは、任意の型の可変個の引数の転送です。
古典的なアプリケーションは、任意のタイプの任意の数のパラメーターを送信することです。
たとえば、次の場合にこの機能を使用します。
たとえば、次の状況でこの機能を使用します。
•共有ポインターが所有する新しいヒープオブジェクトのコンストラクターに引数を渡す:
shared_ptrが所有する新しいヒープオブジェクトのコンストラクターにパラメーターを渡します。
// 複雑4.2及び7.7によって初期化<フロート>に共有ポインタを作成する: オートSP = STD :: make_shared <はstd ::複合< フロート >>(4.2、7.7)。
•ライブラリによって開始されたスレッドへの引数の引き渡し:
標準ライブラリによって開始されたスレッドオブジェクトにパラメータを渡します。
std :: thread t(foo、42、" hello "); // 別のスレッドでfoo(42、 "hello")を呼び出します
•ベクトルにプッシュされた新しい要素のコンストラクターに引数を渡す:
ベクトル内の新しくプッシュされた要素のコンストラクターにパラメーターを渡します。
std :: vector <Customer> v; … v.emplace(" Tim "、" Jovi "、1962); // 3つの引数で初期化されたCustomerを挿入します
通常、引数は移動セマンティクスで完全に転送され(91ページのセクション6.1を参照)、対応する宣言は次のようになります。
通常、これらのパラメーターはモバイルセマンティクスを通じて完全に転送されるため(91ページのセクション6.1を参照)、対応する宣言は次のようになります。
名前空間std { テンプレート <typename T、typename ... Args> shared_ptr <T> make_shared(Args && …args); class thread { public : template <typename F、typename ... Args> explicit thread(F && f、Args && …args); ... }; template <typename T、typename Allocator = allocator <T >> class vector { public : template <typename ... Args> reference emplace_back(Args && … args); ... }; }
また、通常のパラメーターと同じ規則が可変個関数テンプレートパラメーターに適用されることにも注意してください。たとえば、値によって渡される場合、引数はコピーされて減衰します(たとえば、配列はポインターになります)。参照によって渡される場合、パラメーターは元のパラメーターを参照し、減衰しません。
また、通常のパラメーターと同じ規則が変数関数テンプレートパラメーターに適用されることにも注意してください。たとえば、値で渡された場合、パラメーターがコピーされ、型が低下します(たとえば、配列がポインターになります)。参照によって渡される場合、パラメーターは元のパラメーターを参照し、型は退化(減衰)しません。
// argsは減衰したタイプのコピーです:(argsは劣化したパラメーターのコピーです) template <typename ... Args> void foo( Args ... args); // argsは渡されたオブジェクトへの非減衰の参照です:(argsは劣化していないため、渡されますオブジェクト参照へ) テンプレート<typename…Args> void bar(Args const&…args);