Qt中是否有签名的`sizeof`替代方案

时间:2018-12-13 08:33:27

标签: c++ qt

Qt容器的大小返回(签名)int。我们知道在Qt中,更多的是使用int而不是无符号类型size_t来进行算术运算而不需要强制转换。参见Why does Qt use a signed int type for its container classesWhy QVector.size() returns int

当语言关键字sizeof返回size_t类型时,是否有Qt替代方法?

2 个答案:

答案 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!

Demo

它的语义与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()