std :: make_signed接受浮点类型

LB-*_*B-- 5 c++ templates type-traits c++11

我有一个模板类,只能为标量类型(整数,浮点数等)实例化,我希望成员typedef始终是该类型的有符号变体.那是:

unsigned int- > signed int
signed long long- > signed long long(已签名)
unsigned char- > signed char
float- > float
long double- >long double
等...

不幸的是,std::make_signed只适用于整数类型,而不适用于浮点类型.最简单的方法是什么?我正在寻找形式的东西,成为using SignedT = ...;模板参数T的模板化类的一部分已经保证是标量.

And*_*owl 10

一个简单的模板别名可以:

#include <type_traits>

template<typename T>
struct identity { using type = T; };

template<typename T>
using try_make_signed =
    typename std::conditional<
        std::is_integral<T>::value,
        std::make_signed<T>,
        identity<T>
        >::type;
Run Code Online (Sandbox Code Playgroud)

这就是你如何测试它:

int main()
{
    static_assert(::is_same<
        try_make_signed<unsigned int>::type, int
        >::value, "!");

    static_assert(std::is_same<
        try_make_signed<double>::type, double
        >::value, "!");
}
Run Code Online (Sandbox Code Playgroud)

这是一个实例.