C++ 删除字符类型的未签名/未签名

C++ 删除字符类型的未签名/未签名,c++,typetraits,C++,Typetraits,我想为char、short、long和long专门化一个类模板。这种专门化也适用于整数类型的有符号和无符号变体 我知道boost库和std::tr1/C++0x实现是有符号的/无符号的和make\u有符号的/make\u无符号的类型。但是我如何才能从char类型中删除任何有符号的规范(注意:有符号的itype!=itype的唯一整数类型)char的“符号性”是实现定义的。它不必能够存储负数。在严格的标准语言中,char偶数永远不是有符号整数类型,即使它可以在实现中存储负数。尽管如此,如果类模板可

我想为char、short、long和long专门化一个类模板。这种专门化也适用于整数类型的有符号和无符号变体

我知道boost库和std::tr1/C++0x实现是有符号的/无符号的和make\u有符号的/make\u无符号的类型。但是我如何才能从char类型中删除任何有符号的规范(注意:有符号的itype!=itype的唯一整数类型)

char的“符号性”是实现定义的。它不必能够存储负数。在严格的标准语言中,
char
偶数永远不是有符号整数类型,即使它可以在实现中存储负数。尽管如此,如果类模板
可以存储负数,那么它将为
char
报告
true
,因为这对它很有用

无论如何,boost文档中说了以下关于
使_unsigned
的内容,使它看起来像是可以用于您的目的

如果T是无符号整数类型,则与T的类型相同;如果T是有符号整数类型,则为相应的无符号类型。否则,如果T是枚举或字符类型(char或wchar\u T),则为与T宽度相同的无符号整数类型

char
的“符号性”由实现定义。它不必能够存储负数。在严格的标准语言中,
char
偶数永远不是有符号整数类型,即使它可以在实现中存储负数。尽管如此,如果类模板
可以存储负数,那么它将为
char
报告
true
,因为这对它很有用

无论如何,boost文档中说了以下关于
使_unsigned
的内容,使它看起来像是可以用于您的目的

如果T是无符号整数类型,则与T的类型相同;如果T是有符号整数类型,则为相应的无符号类型。否则,如果T是枚举或字符类型(char或wchar\u T),则为与T宽度相同的无符号整数类型


From
make_unsigned
即使在char上也应该有效。你有别的发现吗?如果在您的平台上,
char
相当于
unsigned char
,那么它只会对显式
signed char
类型产生影响,这就是您想要的,对吗?

From
make\u unsigned
即使在char上也应该起作用。你有别的发现吗?如果在您的平台上,
char
相当于
unsigned char
,那么它只会对显式
signed char
类型产生影响,这是您想要的,对吧?

非常手动,几乎没有什么神奇的效果,但是如果您想从
char
中删除
signed
,您可以使用此模板:

template <typename T>
struct remove_sign_from_char {
   typedef T type;
};
template <>
struct remove_sign_from_char<signed char>
{
   typedef char type;
};
template <>
struct remove_sign_from_char<unsigned char>
{
   typedef char type;
};

int main() {
   static_assert( std::is_same< char, remove_sign_from_char<unsigned char>::type >::value );
   static_assert( std::is_same< char, remove_sign_from_char<signed char>::type >::value );
   static_assert( std::is_same< char, remove_sign_from_char<char>::type >::value );
   static_assert( std::is_same< int, remove_sign_from_char<int>::type >::value );
}
模板
结构从字符中删除符号{
T型;
};
样板
结构从字符中删除符号
{
typedef字符类型;
};
样板
结构从字符中删除符号
{
typedef字符类型;
};
int main(){
静态断言(std::is_same中删除_符号_::value);
静态断言(std::is_same中删除_符号_::value);
静态断言(std::is_same中删除_符号_::value);
静态断言(std::is _same:value中删除_符号);
}

非常手动,几乎没有任何魔力,但是如果您想从
字符中删除
已签名的
/
未签名的
,可以使用以下模板:

template <typename T>
struct remove_sign_from_char {
   typedef T type;
};
template <>
struct remove_sign_from_char<signed char>
{
   typedef char type;
};
template <>
struct remove_sign_from_char<unsigned char>
{
   typedef char type;
};

int main() {
   static_assert( std::is_same< char, remove_sign_from_char<unsigned char>::type >::value );
   static_assert( std::is_same< char, remove_sign_from_char<signed char>::type >::value );
   static_assert( std::is_same< char, remove_sign_from_char<char>::type >::value );
   static_assert( std::is_same< int, remove_sign_from_char<int>::type >::value );
}
模板
结构从字符中删除符号{
T型;
};
样板
结构从字符中删除符号
{
typedef字符类型;
};
样板
结构从字符中删除符号
{
typedef字符类型;
};
int main(){
静态断言(std::is_same中删除_符号_::value);
静态断言(std::is_same中删除_符号_::value);
静态断言(std::is_same中删除_符号_::value);
静态断言(std::is _same:value中删除_符号);
}

好的,我找到了一个非常好看的解决方案:

template<typename itype, typename = void> struct my_typedef;
/* ----------------------------------------------------------------------------------------------------- */

template<>
struct my_typedef<char>
{
    typedef char          type;
    typedef signed char   signed_type;
    typedef unsigned char unsigned_type;
}; /* template<> struct my_typedef<char> */
/* ----------------------------------------------------------------------------------------------------- */

template<>
struct my_typedef<short>
{
    typedef short          type;
    typedef signed short   signed_type;
    typedef unsigned short unsigned_type;
}; /* template<> struct my_typedef<short> */
/* ----------------------------------------------------------------------------------------------------- */

template<>
struct my_typedef<long>
{
    typedef long          type;
    typedef signed long   signed_type;
    typedef unsigned long unsigned_type;
}; /* template<> struct my_typedef<long> */
/* ----------------------------------------------------------------------------------------------------- */

template<>
struct my_typedef<long long>
{
    typedef long long          type;
    typedef signed long long   signed_type;
    typedef unsigned long long unsigned_type;
}; /* template<> struct my_typedef<long long> */
/* ----------------------------------------------------------------------------------------------------- */

template<>
struct my_typedef<signed char>
{
    typedef my_typedef<char>::type          type;
    typedef my_typedef<char>::signed_type   signed_type;
    typedef my_typedef<char>::unsigned_type unsigned_type;
}; /* template<> struct my_typedef<signed char> */
/* ----------------------------------------------------------------------------------------------------- */

template<typename itype>
struct my_typedef<itype, typename std::enable_if<std::is_unsigned<itype>, void>::type>
{
    typedef typename my_typedef<typename std::make_signed<itype>::type>::type type;
    typedef typename my_typedef<typename std::make_signed<itype>::type>::type signed_type;
    typedef typename my_typedef<typename std::make_signed<itype>::type>::type unsigned_type;
}; /* template<typename> struct my_typedef<signed itype> */
/* ----------------------------------------------------------------------------------------------------- */
template struct my_typedef;
/* ----------------------------------------------------------------------------------------------------- */
样板
结构我的类型定义
{
typedef字符类型;
typedef signed char signed_type;
typedef unsigned char unsigned_type;
}; /* 模板结构my_typedef*/
/* ----------------------------------------------------------------------------------------------------- */
样板
结构我的类型定义
{
typedef短型;
typedef签名短签名_类型;
typedef无符号短无符号_类型;
}; /* 模板结构my_typedef*/
/* ----------------------------------------------------------------------------------------------------- */
样板
结构我的类型定义
{
typedef长型;
typedef签名长签名_类型;
typedef无符号长无符号_类型;
}; /* 模板结构my_typedef*/
/* ----------------------------------------------------------------------------------------------------- */
样板
结构我的类型定义
{
typedef长-长型;
typedef长符号长符号_type;
typedef无符号长无符号_类型;
}; /* 模板结构my_typedef*/
/* ----------------------------------------------------------------------------------------------------- */
样板
结构我的类型定义
{
typedef my_typedef::type-type;
typedef my_typedef::signed_type signed_type;
typedef my_typedef::unsigned_type unsigned_type;
}; /* 模板结构my_typedef*/
/* ----------------------------------------------------------------------------------------------------- */
样板
结构我的类型定义
{
typedef typename my_typedef::type type;
typedef typename my_typedef::type signed_type;
typedef typename my_typedef::type unsigned_type;
}; /* te