導入
C++のテンプレートプログラミングにおいて、可変長テンプレート(Variadic Templates)は非常に強力な機能です。しかし、受け取った引数が「いくつあるか」を知りたい場面で、どうすればよいか迷うことはありませんか?そんな時に役立つのが sizeof… 演算子 です。この演算子を使うことで、コンパイル時に引数の個数を正確に把握でき、再帰的な処理の終了条件やメタプログラミングにおける分岐制御をシンプルに記述できるようになります。
基礎知識
可変長テンプレートとは、テンプレート引数に「…」を付けることで、任意の個数の引数を受け取れる仕組みです。例えば、template
sizeof… 演算子は、そのパックされたパラメータパック(Args)の要素数を取得するための専用演算子です。sizeof演算子が型のバイトサイズを返すのに対し、sizeof…は「引数の数」を返すという点が最大の特徴です。
実装/解決策
sizeof… の使い方は非常に簡単です。パラメータパックを保持しているテンプレート関数の内部で、sizeof…(パラメータパック名) と記述するだけです。この値はコンパイル時に確定する定数(constexpr)として扱われるため、配列のサイズ指定やif constexpr文の条件式など、コンパイル時の計算が必要な箇所でフル活用できます。
サンプルプログラム
以下のコードは、可変長テンプレートを使用して渡された引数の個数をカウントし、それを出力する例です。
include
// 可変長テンプレート関数
template
void printArgumentCount(Args… args) {
// sizeof… 演算子で引数の個数を取得
constexpr std::size_t count = sizeof…(Args);
std::cout << "渡された引数の数は: " << count << " 個です。" << std::endl; // if constexpr を組み合わせることで、引数の数に応じた処理の切り替えが可能 if constexpr (count == 0) { std::cout << "引数は空です。" << std::endl; } else { std::cout << "引数は1つ以上存在します。" << std::endl; } } int main() { printArgumentCount(10, 3.14, "Hello", 'A'); // 4つの引数を渡す printArgumentCount(); // 引数なしで呼び出す return 0; }
応用・注意点
現場での活用において、if constexpr と組み合わせる手法は特におすすめです。従来の再帰によるテンプレート展開では、コンパイル時間が長くなりがちでしたが、sizeof… と if constexpr を組み合わせることで、不要なコード生成を抑制し、可読性の高いコードを書くことができます。
注意点として、sizeof… はあくまで「テンプレートのパラメータパック」に対してのみ有効です。関数に渡された通常の動的な引数配列などを数えることはできないため、あくまでコンパイル時の静的な情報取得に限定して使用するようにしてください。

コメント