要测量流的位置/偏移/大小,标准指定std::streampos
,std::streamoff
和std::streamsize
,但它们是实现定义的。std :: streampos,std :: streamoff和std :: streamsize long long int?
如何以安全和便携的方式将这些类型转换为long long int
? (例如,测量文件大小并将其注入一个需要很长时间的int作为参数的函数)
要测量流的位置/偏移/大小,标准指定std::streampos
,std::streamoff
和std::streamsize
,但它们是实现定义的。std :: streampos,std :: streamoff和std :: streamsize long long int?
如何以安全和便携的方式将这些类型转换为long long int
? (例如,测量文件大小并将其注入一个需要很长时间的int作为参数的函数)
那么,就C++ 98/03而言,是long long int
。所以我假设你在问C++ 11。
的streamsize
和streamoff
必须是整数类型的类型定义(streampos
不是整数,这样你就不会被传递一个到任何需要long long
)。由于整型是基本类型,因此它们只能由C++定义或作为编译器特定的定义。
因此,唯一的问题是:这些typedefs 大比long long
?所有整型类型都可以转换为更大或相等的类型(尽管有符号/无符号,但所有类型都有符号,所以没有问题)。但如果它更大......你打算怎么办?
假设你不能改变你正在“注入”它的功能的签名(因为如果你可以,没有理由不采取streamsize
作为参数类型,从而避免了这个问题)没有任何选择。您的数据值大于该函数所需的值。这里没有办法绕过它。
您可以在long long
中执行static_cast以关闭编译器,但如果实际大小不适合long long
,则这无助于您。
最终,这是一个棘手的问题。你有一个函数需要一个参数,这个参数对于你传递的参数来说可能太小了。您可以做的最多的事情是通过static_assert
来检测它是否有问题。像这样的东西:
static_assert(sizeof(std::streamsize) <= sizeof(long long), "Oops.");
说实话,我不会担心它。几率很好,long long
将是您的编译器本身支持的最大整数大小。
只需将该值传递给任何需要很长时间的函数。 std::streamoff
和std::streamsize
都是有符号整数类型,并且std::streampos
可以隐式转换为std::streamoff
。
编辑:我想有一个断言,如果有人想出__int128文件大小,streamsize/streamoff不会大于long long
不会伤害。
除了exabytes文件大小的情况,在转换为long long int期间会出现问题吗? – Vincent
@Vincent:不可以。整数类型可以被转换成一个更大(或相等大小)的整数类型,而没有问题。 –
'streampos'隐式地转换为'streamoff',所以你可以将它传递给期望“long long”的东西。 'streampos'和'streamoff'之间的区别是支持有状态字符编码。 – Potatoswatter