可変長テンプレートとパラメーターパック
パラメーターパックと畳み込み式を使って、可変長テンプレートを記述します。
「可変長テンプレートとパラメーターパック」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
可変個数のテンプレート引数
可変長テンプレートは、任意の個数のテンプレート引数を受け取ります。std::make_unique、std::tuple、printf形式のロギングなどの関数を記述するために使用されます。
パラメーターパックの構文
typename... Tsで型パラメーターパックを宣言し、Ts...で展開します。
template <typename... Args>
void print_all(Args... args) {
// ...
}パック展開
式の後ろにある...は、パックをカンマ区切りのリストに展開します。
template <typename... Args>
void pass_through(Args... args) {
other_func(args...); // pass each arg
}再帰的な可変長テンプレート(従来の形式)
C++17より前は、可変長関数を通常、再帰的に記述していました。1つの引数を処理し、残りの引数で再帰的に呼び出します。
// base case
void log() {}
// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
std::cout << first;
log(rest...);
}畳み込み式(C++17)
C++17では畳み込み式が追加され、再帰よりもはるかにすっきりと記述できるようになりました。パック全体に演算子を適用します。
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // fold +
}
std::cout << sum(1, 2, 3, 4); // 10畳み込み演算子
畳み込みには4つの形式があります:
(... op pack)— 単項展開に対する左畳み込み(pack op ...)— 右畳み込み(init op ... op pack)— 初期値付き左畳み込み(pack op ... op init)— 初期値付き右畳み込み
すべての引数の出力
カンマ畳み込みを使った一般的なイディオムです。
template <typename... Args>
void print_all(Args... args) {
((std::cout << args << " "), ...); // comma fold
}
print_all(1, "hi", 3.14); // 1 hi 3.14引数の個数を数える
sizeof...(pack)は、コンパイル時にパック内の要素数を返します。
template <typename... Args>
void info(Args... args) {
std::cout << "count = " << sizeof...(args);
}可変長クラステンプレート
クラステンプレートにもパラメーターパックを指定できます。例:std::tuple<Ts...>。
template <typename... Ts>
class Tuple {
// implementation uses recursion or storage tricks
};パックによる完全転送
可変長テンプレートとstd::forwardを組み合わせると、任意の引数をコンストラクターへ完全転送できます。
template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}型パックの操作
テンプレートの特殊化や畳み込み式を使うと、先頭、末尾、head/tail分解など、コンパイル時のリスト操作を実装できます。
落とし穴
よくある問題:
- パックの展開を忘れる(
argsとargs...の違い) - 畳み込み式での評価順序(結合的でない演算子では左と右の違いが重要です)
- 深い再帰によるコンパイル時間の増加
クイックチェック
パラメーターパックのすべての要素を合計する処理を簡単にするC++17の機能は何ですか。
まとめ
可変長テンプレートは、パラメーターパックによって可変個数のテンプレート引数を処理します。C++17の畳み込み式により、再帰的な可変長コードを簡潔な式に置き換えられます。完全転送と組み合わせることで、ファクトリ関数やジェネリックなディスパッチを支えます。
よくある質問
「可変長テンプレートとパラメーターパック」レッスンは無料ですか?
はい。「可変長テンプレートとパラメーターパック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「可変長テンプレートとパラメーターパック」で何を学びますか?
パラメーターパックと畳み込み式を使って、可変長テンプレートを記述します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「可変長テンプレートとパラメーターパック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 関数テンプレートとクラステンプレート再入門
- テンプレート特殊化:部分特殊化と完全特殊化
- 可変長テンプレートとパラメーターパック
- constexpr関数とif constexpr