C++ 检查变量是否使用is_signed进行签名

C++ 检查变量是否使用is_signed进行签名,c++,c++17,C++,C++17,我想检查变量是否有符号。我发现了一个类模板,它的名字是我不能用它,因为我是C++的新手。如何检查变量是否有符号 #include <iostream> #include <cmath> int main() { // the following short initialization is on purpose short price {10u}; std::cout << std::is_signed<price>::

我想检查变量是否有符号。我发现了一个类模板,它的名字是我不能用它,因为我是C++的新手。如何检查变量是否有符号

#include <iostream>
#include <cmath>

int main() {
    // the following short initialization is on purpose
    short price {10u};
    std::cout << std::is_signed<price>::value << '\n';
    return 0;
}
#包括
#包括
int main(){
//以下简短的初始化是故意的
空头价格{10u};

类模板的std::cout参数必须是类型。 如果您有一个变量,并且希望获取其类型,则可以使用decltype:

std::cout << std::is_signed<decltype (price)>::value << '\n';

std::cout
是有符号的
——与许多其他结构一样,它是对类型执行检查的一种方法,而不是对变量。您可以使用它来获取变量的基本类型

std::cout << std::is_signed<decltype(price)>::value << '\n'; //-> 1

std::cout签名的
实现可以是

template<bool IsArithmetic, typename T> struct is_signed_impl : bool_constant<T(-1) < T(0)>
    {};

template<typename T> struct is_signed_impl<false, T> : false_type
    {};

template<typename T> struct is_signed
        : is_signed_impl<is_arithmetic_v<T>, T>
    {};
模板结构是有符号的\u impl:bool\u常量
{};
模板结构是\u签名的\u impl:false\u类型
{};
模板结构已签名
:是否已签名
{};

中的模板变量
T
已签名
最终用于
T(-1)
,用于强制转换。如果T是非类型参数,如
price
,则强制转换的格式不正确。

是有符号的
用于类型而不是变量。
std::cout@john谢谢你的观点,但是我的意图呢?如果你想知道有符号类型是正的还是负的,请再次比较st zero.
if(price<0){std::cout变量始终是有符号的,因为它是
短的
。从无符号文本初始化它并不重要。C++14方法稍微简单一点:cout@Red.WaveC++17的方法更简单:
cout@RemyLebeau仅仅是“更简单”是错误的。应该是“更简单”。