C++のstd::is_arithmeticテンプレートの使い方を徹底解説
この記事では、C++ STLに用意されているstd::is_arithmeticテンプレートの仕組み、構文、具体的な使用例について詳しく解説します。
is_arithmeticテンプレートは、指定された型Tが算術型(arithmetic type)であるかどうかを判定するために使用される型特性(type traits)の一つです。
算術型とは?
算術型は、大きく以下の2つのカテゴリに分類されます。
整数型(integral types) − 整数値を表す型です。主な整数型は以下の通りです。
- char
- bool
- int
- long
- short
- long long
- wchar_t
- char16_t
- char32_t
浮動小数点型(floating point types) − 小数部分を持つことができる型です。主な浮動小数点型は以下の通りです。
- float
- double
- long double
つまり、is_arithmeticテンプレートは、指定された型Tがこれらの算術型に該当するかどうかを判定し、結果に応じてtrueまたはfalseを返します。なお、ポインタ型やクラス型などは算術型には含まれないため、falseが返される点に注意してください。
構文
template <class T> is_arithmetic;
パラメータ
このテンプレートが受け取るパラメータは型Tの1つだけです。この型Tが算術型であるかどうかを判定します。
戻り値
このテンプレートはbool型の値(trueまたはfalse)を返します。指定された型が算術型であればtrueを、算術型でなければfalseを返します。判定結果にはメンバ定数::valueを通じてアクセスします。
使用例
入力: is_arithmetic<bool>::value; 出力: true 入力: is_arithmetic<class_a>::value; 出力: false
サンプルコード1
#include <iostream>
#include <type_traits>
using namespace std;
class TP {
};
int main() {
cout << boolalpha;
cout << "checking for is_arithmetic template:";
cout << "\nTP class : "<< is_arithmetic<TP>::value;
cout << "\n For Bool value: "<< is_arithmetic<bool>::value;
cout << "\n For long value : "<< is_arithmetic<long>::value;
cout << "\n For Short value : "<< is_arithmetic<short>::value;
return 0;
}出力
上記のコードを実行すると、以下の出力が生成されます。
checking for is_arithmetic template: TP class : false For Bool value: true For long value : true For Short value : true
この例では、ユーザー定義のクラスTPは算術型ではないためfalseが返され、bool・long・shortといった組み込み型は算術型であるためtrueが返されています。
サンプルコード2
次に、基本型とポインタ型を比較する例を見てみましょう。
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "checking for is_arithmetic template:";
cout << "\nInt : "<< is_arithmetic<int>::value;
cout << "\nchar : "<< is_arithmetic<char>::value;
cout << "\nFloat : "<< is_arithmetic<float>::value;
cout << "\nDouble : "<< is_arithmetic<double>::value;
cout << "\nInt *: "<< is_arithmetic<int*>::value;
cout << "\nchar *: "<< is_arithmetic<char*>::value;
cout << "\nFloat *: "<< is_arithmetic<float*>::value;
cout << "\nDouble *: "<< is_arithmetic<double*>::value;
return 0;
}出力
上記のコードを実行すると、以下の出力が生成されます。
checking for is_arithmetic template: Int : true Char : true Float : true Double : true Int * : false Char *: false Float *: false Double *: false
この例から分かるように、int・char・float・doubleといった基本型はすべて算術型として判定されますが、それらのポインタ型(int*、char*など)は算術型には含まれないため、すべてfalseが返されます。
まとめ
std::is_arithmeticは、テンプレートメタプログラミングにおいて型の性質をコンパイル時に判定するための便利なツールです。特に、算術型にのみ適用したいテンプレート関数を作成する際に、static_assertやstd::enable_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