C++のis_referenceテンプレートとは?構文と使い方を実例付きで解説
本記事では、C++ STL に含まれる std::is_reference テンプレートの動作、構文、そして具体的な使用例について詳しく解説します。
is_reference は <type_traits> ヘッダーで定義されているテンプレートで、指定した型 T が参照型であるかどうかを判定するために使用されます。
このテンプレートは is_lvalue_reference と is_rvalue_reference を組み合わせたものと考えることができ、どちらか一方が true であれば is_reference の結果も true になります。
C++における「参照」とは?
参照(リファレンス)とは、すでに存在する変数に付けられた別名(エイリアス)のことです。参照はポインタとは異なり、以下のような特徴があります。
- 参照は null(何も指さない状態)にはできませんが、ポインタは null ポインタになり得ます。
- 参照は一度あるオブジェクトで初期化すると、後から別のオブジェクトを参照先として変更することはできません。一方、ポインタはいつでも任意の別のオブジェクトを指し直すことができます。
- 参照は宣言時に必ず初期化しなければなりませんが、ポインタは作成後に初期化しても構いません。
参照は、参照したい変数の前にアンパサンド(&)記号を付けて宣言します。
構文
template <class T> is_reference;
パラメータ
このテンプレートが受け取るパラメータは型 T のみで、渡された型が参照型かどうかを判定します。
戻り値
ブール値(bool)を返します。指定された型が参照型であれば true を、そうでなければ false を返します。
使用例
入力: is_reference<int>::value; 出力: false 入力: is_reference<int&>::value; 出力: true
例1:クラス型に対する判定
#include <iostream>
#include <type_traits>
using namespace std;
class TP {
};
int main() {
cout << boolalpha;
cout << "Checking for is_reference: ";
cout << "\n class TP : " << is_reference<TP>::value;
cout << "\n class TP&: " << is_reference<TP&>::value;
cout << "\n class TP&&: " << is_reference<TP&&>::value;
return 0;
}
上記のコードを実行すると、次のような結果が出力されます。
Checking for is_reference: class TP : false class TP&: true class TP&&: true
例2:さまざまな基本型に対する判定
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "Checking for is_reference: ";
// int
cout << "\n int: " << is_reference<int>::value;
cout << "\n int&: " << is_reference<int&>::value;
cout << "\n int&&: " << is_reference<int&&>::value;
// char
cout << "\n char: " << is_reference<char>::value;
cout << "\n char&: " << is_reference<char&>::value;
cout << "\n char&&: " << is_reference<char&&>::value;
// float
cout << "\n float: " << is_reference<float>::value;
cout << "\n float&: " << is_reference<float&>::value;
cout << "\n float&&: " << is_reference<float&&>::value;
// double
cout << "\n double: " << is_reference<double>::value;
cout << "\n double&: " << is_reference<double&>::value;
cout << "\n double&&: " << is_reference<double&&>::value;
return 0;
}
上記のコードを実行すると、次のような結果が出力されます。
Checking for is_reference: int: false int&: true int&&: true char: false char&: true char&&: true float: false float&: true float&&: true double: false double&: true double&&: true
補足:C++17以降では is_reference_v が便利
C++17 以降では、変数テンプレートである is_reference_v<T> も利用できます。::value を明示的に書く必要がなくなり、コードをより簡潔に記述できます。
static_assert(!is_reference_v<int>, "int は参照型ではない"); static_assert(is_reference_v<int&>, "int& は参照型");
-
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