最終更新日時:
が更新

履歴 編集

class template
<type_traits>

std::make_signed(C++11)

namespace std {
  template <class T>
  struct make_signed {
    using type = ;
  };

  template <class T>
  using make_signed_t = typename make_signed<T>::type; // C++14
}

概要

整数型を符号付きにする。

要件

Tが、整数型もしくは列挙型(cv修飾を許容する)であること。ただしboolは許可されない。

効果

  • make_signedは、型Tに対応する符号付き整数型を、メンバ型typeとして定義する。
  • Tがcv修飾されていた場合は、メンバ型typeにも同じcv修飾が付加される。

#include <type_traits>

static_assert(std::is_same<
        std::make_signed<int>::type,
        int
    >::value,
    "transform int to int");

static_assert(std::is_same<
        std::make_signed<const unsigned int>::type,
        const int
    >::value,
    "transform const unsigned int to const int");

// my_enumと同じ幅を持つ符号付き整数型に変換
enum my_enum : unsigned int { A, B, C };
static_assert(std::is_same<
        std::make_signed<my_enum>::type,
        int
    >::value,
    "transform unsigned int based my_enum to int");

static_assert(std::is_same<
        std::make_signed<unsigned char>::type,
        signed char
    >::value,
    "transform unsigned char to signed char");

int main() {}

出力

バージョン

言語

  • C++11

処理系

  • Clang: 3.0
  • GCC, C++11 mode: 4.4.7
  • Visual C++: 10.0, 11.0, 12.0, 14.0
    • 10.0は、cv修飾修飾されている型において、コンパイルエラーになるバグがある。
    • make_signed_tは12.0から

参照