Для измерения положения / смещения / размера потоков, в стандарте указывается std::streampos
, std::streamoff
а также std::streamsize
, но они определены реализацией.
Как преобразовать эти типы в long long int
безопасным и портативным способом? (например, чтобы измерить размер файла и вставить его в функцию, которая принимает аргумент long long int)
Что касается 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
будет самым большим целым размером, который изначально поддерживает ваш компилятор.
Просто передайте значение любой функции, которая нуждается в long long. std::streamoff
а также std::streamsize
оба являются целочисленными типами со знаком и std::streampos
неявно конвертируется в std::streamoff
,
редактировать: я предполагаю, что streamsize / streamoff не больше, чем long long
не повредит, если кто-то придумает размер файла __int128.