要測量流的位置/偏移/大小,標準指定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