我如何检查给定的int(或任何其他数据类型)是签名还是未签名? 我在搜索时发现了这个功能,
std::numeric_limits<int>::is_signed
但我只能输入数据类型,有没有办法可以通过变量名检查,比如。
signed int x = 5;
现在我想创建一个函数来检查x是否为带符号的int。
如果你们能回答这些小问题,那将非常感激。
答案 0 :(得分:2)
有没有办法可以通过变量名来检查
从C ++ 11开始,我们有decltype
来获取变量或表达式的类型:
std::numeric_limits<decltype(x)>::is_signed
从历史上看,它比较棘手;从变量推断类型的唯一方法是通过模板参数推导:
template <typename T>
bool is_signed(T const &) {
return std::numeric_limits<T>::is_signed;
}
为什么我们在std后使用'::'这些运算符?
这是范围解析运算符,表示我们希望在命名空间numeric_limits
中查找名称std
。
当我们在
std::cout
中使用它们时它们是什么意思,是否相同?
是。与标准库中的大多数名称一样,cout
也位于namespace std
内。
这里
numeric_limits<>
是一个类还是什么?
它是一个类模板,包含各种静态变量和函数,用于描述用作模板参数的类型。以下是参考:http://en.cppreference.com/w/cpp/types/numeric_limits
同样,为什么我们在is_signed之前使用这些'::'?
再一次,通过说我们希望在is_signed
的类范围内查找名称std::numeric_limits<int>
来解决范围。
答案 1 :(得分:1)
像这样:
constexpr bool is_signed = std::numeric_limits<decltype(x)>::is_signed();
如果numeric_limits
的{{1}}类型没有专门化,则无法编译。更通用的解决方案是来自x
标题的is_signed
:
<type_traits>
是的,constexpr bool is_signed = std::is_signed<decltype(x)>::value;
和numeric_limits
都是类模板。