#include <type_traits>
template<typename T>
using identity = std::common_type<T>;
template<typename T>
using make_signed = typename std::conditional
<
std::is_integral<T>::value,
std::make_signed<T>,
identity<T>
>::type;
int main()
{
static_assert(std::is_same<make_signed<unsigned int>::type, int>::value, "!");
static_assert(std::is_same<make_signed<double>::type, double>::value, "!");
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgaWRlbnRpdHkgPSBzdGQ6OmNvbW1vbl90eXBlPFQ+OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgbWFrZV9zaWduZWQgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsCjwKCXN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLAoJc3RkOjptYWtlX3NpZ25lZDxUPiwKCWlkZW50aXR5PFQ+Cj46OnR5cGU7CgppbnQgbWFpbigpCnsKCXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPG1ha2Vfc2lnbmVkPHVuc2lnbmVkIGludD46OnR5cGUsIGludD46OnZhbHVlLCAiISIpOwoJc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8bWFrZV9zaWduZWQ8ZG91YmxlPjo6dHlwZSwgZG91YmxlPjo6dmFsdWUsICIhIik7Cn0K