C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の可変個引数関数テンプレート(Variadic Templates)の基本構文と実装例

C++の可変個引数関数テンプレートとは

C++における可変個引数関数テンプレート(Variadic Function Templates)とは、引数の個数に制限がなく、任意の数の引数を受け取れる関数テンプレートのことです。C++11で導入されたこの機能を使うことで、型も個数も異なるさまざまな呼び出し方に対応できる、柔軟な汎用関数を作成できます。

構文

template(typename arg, typename... args)
return_type function_name(arg var1, args... var2)

ポイントは「typename...」のように続く省略記号「...」の部分です。これはパラメータパックと呼ばれ、0個以上のテンプレート引数を受け入れることができます。

サンプルコード

#include <iostream>
using namespace std;

void show() { // ベースケース(再帰の終端)
    cout << "I am now empty";
}

template <typename T, typename... T2> // 可変個引数関数テンプレート
void show(T v1, T2... v2) {
    cout << v1 << endl;
    show(v2...); // 残りの引数で再帰呼び出し
}

int main() {
    show(7, 6, 0.04, "hi ", "I am variadic function", "I will show\n");
    return 0;
}

実行結果

7
6
0.04
hi I am variadic function
I will show

I am now empty

コードの仕組み

このプログラムは再帰の手法を利用しています。動作の流れは以下のとおりです。

  • 引数付きで show() が呼び出されると、まず最初の引数 v1 が出力されます。
  • 残りの引数はパラメータパック v2 に格納され、show(v2...) の形で次の呼び出しに展開されます。
  • 呼び出しごとに引数が1つずつ減りながら、再帰的に処理が進みます。
  • すべての引数が処理されると、引数なしの show()(ベースケース)が呼び出されて再帰が終了します。

このように、可変個引数テンプレートでは「少なくとも1つの引数を持つテンプレート関数」と「引数を持たない通常の関数(ベースケース)」を組み合わせることで、任意の個数・任意の型の引数を安全に処理できます。printf 風の自作ログ関数やタプルの実装など、幅広い場面で活用される重要な機能です。

  1. C++のlog()関数とは?自然対数を求める方法をわかりやすく解説

    C++の標準ライブラリには、数学的な計算を行うための便利な関数が多数用意されています。その中でもlog()関数は、数値の自然対数(ネイピア数 e を底とする対数)を求めるために使用される重要な関数です。log()関数の基本情報C/C++のライブラリ関数 double log(double x) は、引数 x の自然対数(底が e の対数)を返します。この関数を使用するには、ヘッダーファイル <cmath> をインクルードする必要があります。関数の宣言double log(double x)パラメータと戻り値パラメータ: x は浮動小数点型(double)の値です。自然対数を求めたい

  2. C++のswap()関数とは?2つの変数の値を入れ替える方法をサンプルコード付きで解説

    swap()関数とは C++のswap()関数は、2つの値を入れ替える(交換する)ための関数です。この関数を利用すれば、一時的な第三の変数を自分で用意することなく、2つの変数の値を簡単に入れ替えることができます。 swap()関数の構文 void swap(int variable_name1, int variable_name2); 変数に値を代入してswap()関数に渡した場合、関数内では値の入れ替えが行われますが、呼び出し元の実際の変数の値は変わりません。これは、引数が「値渡し」で渡されるためです。実際の変数の値を入れ替えたい場合は、後述する「参照渡し」を使用します。 例1:s