C++のstd::is_fundamentalテンプレート徹底解説!型判定の使い方と実例
この記事では、C++ STLに用意されているstd::is_fundamentalテンプレートの仕組み、構文、具体的な使用例について詳しく解説します。
is_fundamentalは、<type_traits>ヘッダーファイルに定義されているテンプレートの一つで、指定した型Tが「基本型(fundamental type)」であるかどうかをコンパイル時に判定するために使用されます。
基本型(Fundamental Type)とは?
基本型とは、コンパイラ自体にあらかじめ組み込まれている組み込み型のことです。代表的なものとして、int、float、char、doubleなどが挙げられます。これらは「組み込みデータ型」とも呼ばれます。
一方、class、enum、structといったユーザー定義型や、参照・ポインタなどの派生的な型は、基本型には含まれません。is_fundamentalはこれらをすべてfalseと判定します。
構文
template <class T> is_fundamental;
パラメータ
このテンプレートは、判定対象となる単一の型パラメータTを受け取ります。そして、その型Tが基本型であるかどうかをチェックします。
戻り値
ブール値(bool)を返します。指定された型が基本データ型であればtrue、そうでなければfalseとなります。
入出力例
Input: class final_abc;
is_fundamental<final_abc>::value;
Output: False
Input: is_fundamental<int>::value;
Output: True
Input: is_fundamental<int*>::value;
Output: Falseサンプルコード1:クラス型とchar型の判定
#include <iostream>
#include <type_traits>
using namespace std;
class TP {
//TP Body
};
int main() {
cout << boolalpha;
cout << "checking for is_fundamental:";
cout << "\nTP: "<< is_fundamental<TP>::value;
cout << "\nchar :"<< is_fundamental<char>::value;
cout << "\nchar& :"<< is_fundamental<char&>::value;
cout << "\nchar* :"<< is_fundamental<char*>::value;
return 0;
}出力結果
上記のコードを実行すると、次のような出力が得られます。
checking for is_fundamental: TP: false char : true char& : false char* : false
この結果から、ユーザー定義のクラスTPはもちろん、char型であっても参照(char&)やポインタ(char*)にすると基本型とはみなされないことがわかります。
サンプルコード2:数値型の判定
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "checking for is_fundamental:";
cout << "\nint: "<< is_fundamental<int>::value;
cout << "\ndouble :"<< is_fundamental<double>::value;
cout << "\nint& :"<< is_fundamental<int&>::value;
cout << "\nint* :"<< is_fundamental<int*>::value;
cout << "\ndouble& :"<< is_fundamental<double&>::value;
cout << "\ndouble* :"<< is_fundamental<double*>::value;
return 0;
}出力結果
上記のコードを実行すると、次のような出力が得られます。
checking for is_fundamental: int: true double : true int& : false int* : false double& : false double* : false
まとめ
std::is_fundamentalは、テンプレートメタプログラミングにおいて型の性質をコンパイル時に安全に判定できる便利なツールです。intやdoubleなどの純粋な組み込み型のみtrueを返し、ポインタや参照、ユーザー定義型に対してはfalseを返す点を押さえておきましょう。SFINAEやconstexpr ifと組み合わせることで、型に応じた柔軟な処理の分岐を実現できます。
-
C++のexpm1()関数とは?使い方とコード例を解説
expm1()関数は、自然対数の底eを任意の数で累乗した値から1を引いた結果を計算するために使用される数学関数です。つまり、(e^a) - 1 の値を返します。 expm1()の数学的な表現は以下の通りです。 expm1(a) = (e^a) - 1 なお、xが非常に小さい値の場合、e^xは1に近づくため、通常の方法(exp(x) - 1)で計算すると桁落ちによって精度が低下します。expm1()関数を使うことで、このようなケースでも高精度な結果を得ることができます。 C++におけるexpm1()関数の構文は以下の通りです。 float expm1(variable_name); 各要素の意
-
C++のlog1p()関数とは?使い方とサンプルコードをわかりやすく解説
C++のlog1p()関数の概要C++のlog1p()関数は、任意の数値 a に対して「(a + 1) の自然対数(底が e の対数)」を計算するための関数です。戻り値として (a+1) の自然対数の値が返されます。なお、引数に -1 未満の値 を渡した場合は、有効な結果が得られないため NaN(Not a Number) が返される点に注意が必要です。数学的な表現log1p() の動作は、次の数式で表すことができます。log1p(a) = base-e log(a+1)log1p()の構文C++における log1p() 関数の構文は以下のとおりです。float log1p(float var