C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のstd::is_signedテンプレートとは?符号付き型の判定方法と使い方を解説

この記事では、C++ STLに用意されている std::is_signed テンプレートの仕組み、構文、そして具体的な使用例について詳しく解説します。

is_signed<type_traits> ヘッダーファイルに定義されているテンプレートで、指定された型 T が「符号付き型」であるかどうかを判定するために使用します。

符号付き型とは?

符号付き型とは、正負の符号情報を持つ基本的な算術型のことです。すべての算術データ型は、「符号付き」と「符号なし」のいずれかに分類されます。

たとえば、負の値を表現したい場合には符号付き型を使用します。

  • -1 は符号付き int
  • -1.009 は符号付き float

デフォルトではすべての整数型は符号付きとして扱われるため、符号なしとして扱いたい場合には、型名の前に unsigned を付ける必要があります。

構文

template <class T> is_signed;

パラメータ

このテンプレートは、型パラメータ T を1つだけ受け取り、その T が符号付き型であるかどうかを判定します。

戻り値

ブール値を返します。指定した型が符号付き型であれば true、そうでなければ false を返します。

入出力例

入力:is_signed<int>::value;
出力:true

入力:is_signed<unsigned int>::value;
出力:false

サンプルコード①:クラス型・列挙型に対する判定

#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_signed:";
    cout << "\nint:" << is_signed<int>::value;
    cout << "\nTP:" << is_signed<TP>::value;
    cout << "\nTP_1:" << is_signed<TP_1>::value;
    cout << "\nTP_2:" << is_signed<TP_2>::value;
    return 0;
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

checking for is_signed:
int: true
TP: false
TP_1: false
TP_2: false

クラス型や列挙型は算術型ではないため、is_signed の判定対象外となり、すべて false が返される点に注意してください。

サンプルコード②:各種算術型に対する判定

#include <iostream>
#include <type_traits>
using namespace std;
int main() {
    cout << boolalpha;
    cout << "checking for is_signed:";
    cout << "\nfloat:" << is_signed<float>::value;
    cout << "\nSigned int:" << is_signed<signed int>::value;
    cout << "\nUnsigned int:" << is_signed<unsigned int>::value;
    cout << "\ndouble:" << is_signed<double>::value;
    return 0;
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

checking for is_signed:
float: true
Signed int: true
Unsigned int: false
double: true

まとめ

std::is_signed は、ある型が符号付きの算術型かどうかをコンパイル時に判定できる便利な型トレイトです。符号付き整数型や浮動小数点型に対しては true を返し、符号なし整数型、クラス型、列挙型などに対しては false を返します。テンプレートメタプログラミングにおいて、型の性質に応じて処理を分岐させたい場合に活用できます。

  1. C++でプロセスを強制終了する方法:BFSを使った実装解説

    n個のプロセスがあると仮定します。各プロセスには、PID(プロセスID)と呼ばれる一意の識別子が割り当てられており、さらにPPID(親プロセスID)も持っています。各プロセスが持てる親プロセスは1つだけですが、子プロセスは1つでも複数でも構いません。これはまさに木構造と同じ形です。PPIDが0になるプロセスは1つだけであり、それはそのプロセスに親が存在しないことを意味します。また、すべてのPIDは一意な正の整数です。問題の概要ここでは、2つの整数リストを使ってプロセスの一覧を表現します。1つ目のリストには各プロセスのPIDが含まれ、2つ目のリストにはそれに対応するPPIDが含まれます。このとき

  2. C++で解くリスのナッツ収集シミュレーション ― 最小移動距離を求めるアルゴリズム

    問題概要 1本の木、1匹のリス、そして複数のナッツがフィールド上にあります。それぞれの位置は2次元グリッドのセルで表現されます。この問題の目的は、リスがすべてのナッツを集めて木の下に1個ずつ運ぶときの最小移動距離を求めることです。 リスの行動には次の制約があります。 一度に持てるナッツは最大1個 移動は上下左右の4方向で、隣接するセルへのみ可能 距離は移動回数(ステップ数)で表される たとえば、入力が「高さ: 5 / 幅: 7 / 木の位置: [2,2] / リスの位置: [4,4] / ナッツ: [[3,0], [2,5]]」の場合、出力は 12 となります。 解法のポイント まず、