導入
C++でテンプレートプログラミングを行っていると、「この型は配列なのか、それとも単一の変数なのか」を判別したい場面に出くわします。例えば、配列を受け取ったときだけ要素数を取得したり、ポインタと配列を区別して処理を分岐させたりする場合です。このような際に、手動で判定ロジックを書くとバグの温床になります。そこで役立つのが、C++17から導入されたメタ関数「std::is_array_v」です。これを使うことで、コンパイル時に型を安全かつ簡潔に判定できます。
基礎知識
std::is_array_vは、
実装/解決策
std::is_array_vを使用するには、まず
サンプルプログラム
以下のコードは、渡された引数が配列型かどうかを判定し、配列の場合はその要素数を表示する例です。
include
include
// 配列かどうかを判定し、情報を出力する関数テンプレート 現場で活用する際の注意点は、「ポインタと配列を混同しないこと」です。例えば、int ptr = arr; とした場合、ptrは配列ではなくポインタ型であるため、std::is_array_vはfalseを返します。また、std::arrayやstd::vectorなどのコンテナクラスも、C++の定義上は配列型ではないためfalseとなります。もしコンテナも含めて判定したい場合は、別途コンセプトやテンプレートメタプログラミングによる判定が必要になります。あくまで「組み込みの配列」を対象にする際に強力な武器になるツールだと覚えておきましょう。
template
void checkType(const T& value) {
// std::is_array_vで型を判定
if constexpr (std::is_array_v
std::cout << "これは配列型です。" << std::endl;
// 配列のサイズを取得
std::cout << "要素数: " << sizeof(value) / sizeof(value[0]) << std::endl;
} else {
std::cout << "これは配列型ではありません。" << std::endl;
}
}
int main() {
int arr[10] = {0};
int val = 10;
checkType(arr); // 配列なのでtrueと判定される
checkType(val); // 単一のintなのでfalseと判定される
return 0;
}
応用・注意点

コメント