Qt 中是不是有签名的“sizeof”替代方案

Posted

技术标签:

【中文标题】Qt 中是不是有签名的“sizeof”替代方案【英文标题】:Is there a signed `sizeof` alternative in QtQt 中是否有签名的“sizeof”替代方案 【发布时间】:2018-12-13 08:33:26 【问题描述】:

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 替代方案?

【问题讨论】:

【参考方案1】:

您可以制作自己的安全版本:

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

【讨论】:

【参考方案2】:

正确的答案是这是不可能的。 std::size_t 可以是std::uintmax_t,这意味着即使是最大的符合标准的类型std::intmax_t 也不能保存std::size_t 的所有值。

在大多数情况下,您不必担心。在大多数情况下,int(或long long)将保持对象的大小,因此您可以将其转换为:static_cast&lt;long long&gt;(sizeof(T))。如果您正在做指针运算,请考虑使用std::ptrdiff_t,或者不使用sizeof 而使用end() - begin()

【讨论】:

以上是关于Qt 中是不是有签名的“sizeof”替代方案的主要内容,如果未能解决你的问题,请参考以下文章

Qt 对于我的带宽上限来说太大了。我的替代方案是啥? [关闭]

Windows 代码签名过程和 MS signtool.exe 的替代方案? [关闭]

PIG 中是不是有 HBaseStorage 的替代方案

NUnit 断言是不是有 ShouldBeEquivalentTo() 替代方案?

在旧版本的 MongoDB 中是不是有 $expr 的替代方案?

.NET Core 的 MiniProfiler 是不是有任何可行的替代方案?