1. 導入:なぜ型判定が必要なのか
C++でプログラミングをしていると、「今扱っているデータが数値なのか、それとも自作したクラス(構造体)なのか」を判別したい場面に出くわします。特にテンプレートを使った汎用的なライブラリを作る際、型によって処理を切り分けたいという課題は頻繁に発生します。これを解決してくれるのが、今回紹介する「std::is_fundamental_v」です。これを使うことで、安全で柔軟なコードを書くための第一歩を踏み出せます。
2. 基礎知識:基本データ型とは何か
C++における「基本データ型(Fundamental types)」とは、言語が標準で提供している最も基本的な型のことを指します。具体的には、int, double, char, boolといった数値や文字の型に加え、何も返さないことを示すvoid、そしてポインタが空であることを表すstd::nullptr_tなどが含まれます。これら以外の、ユーザーが定義したクラスや構造体などは「基本型ではない」とみなされます。
3. 実装と解決策
std::is_fundamental_vは、
4. サンプルプログラム
以下のコードは、実際に様々な型に対して基本型かどうかを判定する例です。コピー&ペーストして、コンパイルして実行してみてください。
include <iostream>
include <type_traits> // std::is_fundamental_vを使用するために必要
// 型の名前を表示して、基本型かどうかを判定する関数
template <typename T>
void checkType(const char typeName) {
if constexpr (std::is_fundamental_v<T>) {
std::cout << typeName << " は基本データ型です。" << std::endl;
} else {
std::cout << typeName << " は基本データ型ではありません。" << std::endl;
}
}
struct MyStruct {}; // 自作の構造体
int main() {
checkType<int>("int"); // 基本型
checkType<double>("double"); // 基本型
checkType<std::nullptr_t>("nullptr_t"); // 基本型
checkType<MyStruct>("MyStruct"); // 自作型(基本型ではない)
return 0;
}
5. 応用・注意点
現場で活用する際のポイントとして、if constexprとの併用が挙げられます。これを使うことで、基本型のときだけ実行されるコードと、そうでないときに実行されるコードを安全に分けることができます。
注意点として、ポインタ型(例: int)は、たとえ中身がintであっても「基本型」には含まれません。ポインタは「複合型」として扱われるためです。もし「ポインタも含めたい」という場合は、別の判定ツールが必要になります。まずは「データそのものの型」を扱う際に、この機能を活用してみてください。

コメント