我要检查变量是否已签名。我发现了一个名为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;
}
答案 0 :(得分:8)
is_signed
-像其他许多结构一样,是对类型进行检查的一种方法-但不能对变量进行检查。您可以使用decltype
来获取变量的基础类型。
std::cout << std::is_signed<decltype(price)>::value << '\n'; //-> 1
也-is_signed
是在<type_traits>
中定义的,而不是在<cmath>
中定义的。
要获取 信息,请分别使用price > 0
或price < 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
这样的非类型参数,则强制转换格式不正确。