namespace std {
template <class T>
struct make_unsigned {
using type = …;
};
template <class T>
using make_unsigned_t = typename make_unsigned<T>::type; // C++14
}
概要
整数型を符号なしにする。
要件
型Tが、整数型もしくは列挙型(cv修飾を許容する)であること。ただしboolは許可されない。
効果
make_unsignedは、型Tに対応する符号なし整数型を、メンバ型typeとして定義する。- 型
Tがcv修飾されていた場合は、メンバ型typeにも同じcv修飾が付加される。
例
#include <type_traits>
static_assert(std::is_same<
std::make_unsigned<unsigned int>::type,
unsigned int
>::value,
"transform unsigned int to unsigned int");
static_assert(std::is_same<
std::make_unsigned<const int>::type,
const unsigned int
>::value,
"transform const int to const unsigned int");
// my_enumと同じ幅を持つ符号なし整数型に変換
enum my_enum : int { A, B, C };
static_assert(std::is_same<
std::make_unsigned<my_enum>::type,
unsigned int
>::value,
"transform int based my_enum to unsigned int");
static_assert(std::is_same<
std::make_unsigned<signed char>::type,
unsigned char
>::value,
"transform signed char to unsigned char");
int main() {}
出力
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅
- GCC: 4.4.7 ✅
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅
- 2010は、cv修飾されている型において、コンパイルエラーになるバグがある。
make_unsigned_tは2013から