【C++】std::is_unsignedテンプレートの使い方を徹底解説!構文・戻り値・実例付き
この記事では、C++ STLに含まれるstd::is_unsignedテンプレートの仕組み、構文、そして具体的なコード例について詳しく解説します。
is_unsignedは、<type_traits>ヘッダーファイルで定義されているテンプレートの一つです。このテンプレートを使うことで、指定した型Tが「符号なし(unsigned)型」であるかどうかをコンパイル時に判定できます。
C++における符号なしデータ型とは?
符号なしデータ型とは、「値が負になることがない」と分かっている場合に使用する型のことです。例えば、学籍番号やID、乱数のシード値などが該当します。
型を符号なしとして扱いたい場合は、データ型の前にキーワードunsignedを付けて宣言します。
unsigned int;
なお、unsigned修飾子は基本的に整数型に対して使用されるものであり、floatやdoubleなどの浮動小数点数型には適用できません。そのため、浮動小数点型に対してis_unsignedを判定するとfalseが返ります。
構文
template <class T> is_unsigned;
パラメータ
このテンプレートは、判定対象となる型Tを1つだけ引数として受け取り、その型が符号なし型であるかどうかをチェックします。
戻り値
ブール値(bool)を返します。
- 指定された型が符号なし型の場合 → true
- 指定された型が符号なし型ではない場合 → false
入出力のイメージ
入力: is_unsigned<unsigned int>::value; 出力: true 入力: is_unsigned<int>::value; 出力: false
サンプルコード①:クラス型・列挙型での判定
まずは、クラス型や列挙型に対してis_unsignedを使用した例を見てみましょう。
#include <iostream>
#include <type_traits>
using namespace std;
class TP {
};
enum TP_1 : int {};
enum class TP_2 : int {};
int main() {
cout << boolalpha;
cout << "checking for is_unsigned:";
cout << "\nint:" << is_unsigned<int>::value;
cout << "\nTP:" << is_unsigned<TP>::value;
cout << "\nTP_1:" << is_unsigned<TP_1>::value;
cout << "\nTP_2:" << is_unsigned<TP_2>::value;
return 0;
}出力結果
上記のコードを実行すると、以下の出力が得られます。
checking for is_unsigned: int: false TP: false TP_1: false TP_2: false
このように、通常のint型やユーザー定義のクラス型・列挙型はすべて符号なし型とはみなされず、falseが返ることが確認できます。
サンプルコード②:各種基本型での判定
次に、float、signed int、unsigned int、doubleといった基本的なデータ型に対して判定を行う例です。
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "checking for is_unsigned:";
cout << "\nfloat:" << is_unsigned<float>::value;
cout << "\nSigned int:" << is_unsigned<signed int>::value;
cout << "\nUnsigned int:" << is_unsigned<unsigned int>::value;
cout << "\ndouble:" << is_unsigned<double>::value;
return 0;
}出力結果
上記のコードを実行すると、以下の出力が得られます。
checking for is_unsigned: float: false Signed int: false Unsigned int: true Double: false
まとめ
std::is_unsignedは、型が符号なし整数型かどうかをコンパイル時に安全に判定できる便利なタイプライツ(type traits)です。テンプレートメタプログラミングや、オーバーロード解決の条件分岐(SFINAE、if constexprなど)において活用されることが多く、型安全性を高めたい場面で非常に有用です。ぜひ実際のコードでも活用してみてください。
-
C++でプロセスを強制終了する方法:BFSを使った実装解説
n個のプロセスがあると仮定します。各プロセスには、PID(プロセスID)と呼ばれる一意の識別子が割り当てられており、さらにPPID(親プロセスID)も持っています。各プロセスが持てる親プロセスは1つだけですが、子プロセスは1つでも複数でも構いません。これはまさに木構造と同じ形です。PPIDが0になるプロセスは1つだけであり、それはそのプロセスに親が存在しないことを意味します。また、すべてのPIDは一意な正の整数です。問題の概要ここでは、2つの整数リストを使ってプロセスの一覧を表現します。1つ目のリストには各プロセスのPIDが含まれ、2つ目のリストにはそれに対応するPPIDが含まれます。このとき
-
C++で解くリスのナッツ収集シミュレーション ― 最小移動距離を求めるアルゴリズム
問題概要 1本の木、1匹のリス、そして複数のナッツがフィールド上にあります。それぞれの位置は2次元グリッドのセルで表現されます。この問題の目的は、リスがすべてのナッツを集めて木の下に1個ずつ運ぶときの最小移動距離を求めることです。 リスの行動には次の制約があります。 一度に持てるナッツは最大1個 移動は上下左右の4方向で、隣接するセルへのみ可能 距離は移動回数(ステップ数)で表される たとえば、入力が「高さ: 5 / 幅: 7 / 木の位置: [2,2] / リスの位置: [4,4] / ナッツ: [[3,0], [2,5]]」の場合、出力は 12 となります。 解法のポイント まず、