Qt容器的大小返回(签名)int
。我们知道在Qt中,更多的是使用int
而不是无符号类型size_t
来进行算术运算而不需要强制转换。参见Why does Qt use a signed int type for its container classes和Why QVector.size() returns int
当语言关键字sizeof
返回size_t
类型时,是否有Qt替代方法?
答案 0 :(得分:6)
您可以制作自己的安全版本:
template<std::size_t s>
constexpr int safeIntCast()
{
static_assert(s <= std::numeric_limits<int>::max(), "Type too large for ssizeof()!");
return static_cast<int>(s);
}
#define ssizeof(x) safeIntCast<sizeof(x)>()
/// Usage
static_assert(ssizeof(int) == 4);
static_assert(ssizeof(1.0) == 8);
static_assert(ssizeof(std::declval<int>()) == 4);
static_assert(ssizeof(int[1000000000000]) > 4); // Conversion problem is caught!
它的语义与sizeof
相同,但是在确保转换不会溢出的同时会产生int
。
答案 1 :(得分:2)
正确的答案是这是不可能的。 std::size_t
可以是std::uintmax_t
,这意味着即使最大的标准兼容类型std::intmax_t
也无法容纳std::size_t
的所有值。
在大多数情况下,您不必担心。在大多数情况下,int
(或long long
)将保留对象的大小,因此可以将其强制转换为static_cast<long long>(sizeof(T))
。如果要进行指针算术运算,请考虑使用std::ptrdiff_t
,或者不使用sizeof
并进行end() - begin()
。