std :: streampos, std :: streamoff и std :: streamsize для long long int?

Для измерения положения / смещения / размера потоков, в стандарте указывается std::streampos, std::streamoff а также std::streamsize, но они определены реализацией.

Как преобразовать эти типы в long long int безопасным и портативным способом? (например, чтобы измерить размер файла и вставить его в функцию, которая принимает аргумент long long int)

7

Решение

Что касается C ++ 98/03, то здесь нет long long int, Итак, я предполагаю, что вы спрашиваете о C ++ 11.

streamsize а также streamoff должны быть typedefs целочисленного типа (streampos не является целым числом, так что вы не будете передавать это чему-либо, что занимает long long). Поскольку целочисленные типы являются базовыми типами, они могут быть определены только в C ++ или в качестве определения, специфичного для компилятора.

Таким образом, единственный вопрос заключается в следующем: являются ли эти typedefs больше чем long long? Все целочисленные типы могут быть преобразованы в тип большего или равного размера (несмотря на то, что он подписан или не подписан, но все типы здесь подписаны, поэтому проблем нет). Но если оно больше … что ты собираешься с этим делать?

Предполагая, что вы не можете изменить сигнатуру функции, в которую вы «внедряете» ее (потому что, если бы вы могли, нет причин не просто streamsize как тип параметра и, таким образом, избежать проблемы), у вас нет никаких вариантов. У вас есть значение данных, которое больше, чем то, что принимает функция. Там нет никакого способа обойти это здесь.

Вы можете выполнить static_cast в long long закрыть компилятор, но это не поможет, если фактический размер не помещается в long long,

В конечном итоге это неразрешимая проблема. У вас есть функция, которая принимает параметр, который потенциально слишком мал для того, что вы передаете. Максимум, что вы можете сделать, это определить, когда это может быть проблемой с помощью static_assert, Что-то вроде этого:

static_assert(sizeof(std::streamsize) <= sizeof(long long), "Oops.");

Если честно, я бы об этом не беспокоился. Хорошие шансы, что long long будет самым большим целым размером, который изначально поддерживает ваш компилятор.

5

Другие решения

Просто передайте значение любой функции, которая нуждается в long long. std::streamoff а также std::streamsize оба являются целочисленными типами со знаком и std::streampos неявно конвертируется в std::streamoff,

редактировать: я предполагаю, что streamsize / streamoff не больше, чем long long не повредит, если кто-то придумает размер файла __int128.

1

По вопросам рекламы [email protected]