检查变量是否使用is_signed签名

时间:2019-02-16 21:51:14

标签: c++ c++17

我要检查变量是否已签名。我发现了一个名为is_signed的类模板,但是由于我是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;
}

3 个答案:

答案 0 :(得分:8)

is_signed-像其他许多结构一样,是对类型进行检查的一种方法-但不能对变量进行检查。您可以使用decltype来获取变量的基础类型。

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

也-is_signed是在<type_traits>中定义的,而不是在<cmath>中定义的。


如评论中已经提到的那样;如果您只是想查看变量是正数还是负数,则不需要任何库实用程序。

要获取 信息,请分别使用price > 0price < 0。当然,这些只是运行时操作。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

is_signed的实现可能类似于

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>
    {};

T中的模板变量is_signed<T>最终在T(-1) < T(0)中使用,用于转换。如果T是像price这样的非类型参数,则强制转换格式不正确。