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: 4.4.7 ✅
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅
- 2010は、cv修飾されている型において、コンパイルエラーになるバグがある。
make_signed_tは2013から