0Pricing
C++ Academy · レッスン

可変長テンプレートとパラメーターパック

パラメーターパックと畳み込み式を使って、可変長テンプレートを記述します。

「可変長テンプレートとパラメーターパック」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 関数テンプレートとクラステンプレート再入門
  2. テンプレート特殊化:部分特殊化と完全特殊化
  3. 可変長テンプレートとパラメーターパック
  4. constexpr関数とif constexpr
← C++ Academyに戻る