1. 導入:なぜ型判定が必要なのか
C++でプログラミングをしていると、「今扱っているデータはintのような単純な数値なのか、それとも配列やクラスのような複数の要素を持つものなのか」をプログラムに判断させたい場面があります。
例えば、関数に渡された型によって処理を分けたい時や、テンプレートを使って汎用的なライブラリを作る時です。このような時に役立つのが「型特性(Type Traits)」と呼ばれる機能です。今回は、その中でも特定の型が「複合型」であるかを判定する std::is_compound_v について解説します。
2. 基礎知識:複合型(Compound Type)とは?
C++において、型は大きく分けて「基本型(Fundamental Type)」と「複合型(Compound Type)」に分類されます。
基本型とは、int、char、float、bool など、言語仕様で定義されたもっとも単純なデータ単位を指します。
一方で複合型とは、基本型を組み合わせて作られる複雑な型のことです。具体的には以下のようなものが含まれます。
・配列(int[5] など)
・ポインタ(int など)
・参照(int& など)
・クラス・構造体(struct, class)
・列挙型(enum)
・関数型
これらを判定するためのツールが std::is_compound_v です。
3. 実装/解決策:std::is_compound_v の使い方
std::is_compound_v は、指定した型が複合型であれば true を、基本型であれば false を返します。
この機能を使うには、標準ライブラリの
4. サンプルプログラム
以下のコードをコピーして、ご自身の環境で実行してみてください。それぞれの型がどのような判定結果になるかを確認できます。
include
include
// 判定結果を分かりやすく表示する関数
template
void check_type(const char name) {
if (std::is_compound_v
std::cout << name << " は「複合型」です。" << std::endl;
} else {
std::cout << name << " は「基本型」です。" << std::endl;
}
}
int main() {
// 基本型のテスト
check_type
check_type
// 複合型のテスト
check_type
check_type
check_type
struct MyStruct {};
check_type
return 0;
}
5. 応用・注意点:現場で役立つポイント
テンプレートメタプログラミングでの活用
std::is_compound_v は、単体で使うよりも、std::enable_if や if constexpr 文と組み合わせて使うのが一般的です。「もし複合型ならこの処理、基本型ならこの処理」といった条件分岐をコンパイル時に書くことで、柔軟でバグの少ないコードが作成できます。
注意点:ポインタと参照の扱い
初心者の方が陥りやすいのは、ポインタ型(T)や参照型(T&)が複合型に分類されるという点です。例えば、int は int へのポインタという「複合された情報」を持つため、たとえ指し先が int であっても複合型として判定されます。
型判定を正しく行うことは、意図しない型の混入を防ぐための第一歩です。ぜひ、テンプレートを駆使したプログラムを書く際に活用してみてください。

コメント