Есть ли подписанная альтернатива sizeof в Qt - PullRequest
0 голосов
/ 13 декабря 2018

Размеры возвращаемых контейнеров Qt (подписано) int.И мы знаем, что в Qt гораздо больше используется int вместо типа без знака size_t для выполнения арифметических операций без необходимости приведения.См. Почему Qt использует тип int со знаком для своих контейнерных классов & Почему QVector.size () возвращает int

Поскольку ключевое слово языка sizeof возвращает size_t type, есть ли альтернатива Qt для этого?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы можете сделать свою собственную безопасную версию:

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, в то время какубедившись, что преобразование не переполняется.

0 голосов
/ 13 декабря 2018

Правильный ответ: это невозможно.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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...