std :: streampos,std :: streamoff和std :: streamsize到long long int?

Vin*_*ent 7 c++ file standards-compliance stream c++11

为了测量流的位置/偏移/尺寸,标准指定std::streampos,std::streamoffstd::streamsize,但它们是实现定义.

如何以long long int安全和便携的方式转换这些类型?(例如,测量文件大小并将其注入一个以long long int作为参数的函数)

Nic*_*las 5

那么,就C++ 98/03而言,没有 long long int.所以我假设你在问C++ 11.

streamsizestreamoff需要是一个整数类型的类型定义(streampos不是整数,这样你就不会被传递一个到任何需要long long).由于整数类型是基本类型,因此它们只能由C++或特定于编译器的定义定义.

因此,唯一的问题是:在这些类型定义较大的long long?所有整数类型都可以转换为更大或相同大小的类型(尽管有符号/无符号,但这里的所有类型都是有符号的,所以没问题).但如果它更大......你打算怎么做呢?

假设你无法改变你正在"注入"它的功能的签名(因为如果你可以,没有理由不把它streamsize作为参数类型,从而避免问题),你没有任何选择.您的数据值大于函数所需的数据值.这里无法绕过它.

您可以执行一个static_cast long long来关闭编译器,但是如果实际大小不适合,那么这将无济于事long long.

最终,这是一个棘手的问题.你有一个函数,它接受的参数可能太小而不能传递.你能做的最多的事情是通过a检测它何时可能是一个问题static_assert.像这样的东西:

static_assert(sizeof(std::streamsize) <= sizeof(long long), "Oops.");
Run Code Online (Sandbox Code Playgroud)

说实话,我不担心.赔率很高,这long long将是您的编译器本身支持的最大整数大小.