由於ints和longs以及其他整數類型可能在不同的系統上有不同的大小,爲什麼不能有stouint8_t()
,stoint64_t()
等,這樣可以將可移植的字符串轉換爲int代碼呢?爲什麼stoi,stol不是固定寬度的整數?
回答
因爲它是通常沒有必要。分別返回long long
和unsigned long long
的結果。如果要將字符串轉換爲int64_t
,則只需撥打stoll()
並將結果存儲在int64_t
對象中;該值將被隱式轉換。
這假定long long
是最寬的帶符號整數類型。與C一樣(從C99開始),C++允許擴展整數類型,其中一些可能比[unsigned] long long
更寬。 C提供的轉換函數strtoimax
和strtoumax
(分別在intmax_t
和uintmax_t
上操作)在<inttypes.h>
中。無論出於何種原因,C++沒有這個功能提供包裝(邏輯名稱是stoimax
和stoumax
。
但是,這不會不管,除非您使用的是C++編譯器,提供了一個擴展整型寬於[unsigned] long long
,我不知道,任何這樣的編譯器確實存在對於任何類型的寬度不超過64位,現有的功能都是你需要
例如:。
#include <iostream>
#include <string>
#include <cstdint>
int main() {
const char *s = "0xdeadbeeffeedface";
uint64_t u = std::stoull(s, NULL, 0);
std::cout << u << "\n";
}
C++也支持'intmax_t',但不提供'strtoimax'上的'std :: stoimax'包裝。 –
正如固定大小的整數類型本身一樣必要。對不起,但我不能同意這種評估。 –
即有時需要,有時不需要 –
因爲打字,這將使我想砍掉我的手指
嚴重的是,基本的整數類型是int
和long
和std::stoX
功能都只是圍繞strtol
等非常簡單的包裝,並注意C沒有提供strtoi32
或strtoi64
或任何std::stouint32_t
可以換。
如果你想要更復雜的東西,你可以自己寫。
我一樣好問「爲什麼人們使用int
和long
,而不是int32_t
和int64_t
無處不在,因此代碼移植?」答案會是因爲它並不總是必要的。
但實際的原因可能是沒有人提出過這個標準。事情不只是神奇地出現在標準中,有人必須寫一份提案並說明添加它們的理由,並說服委員會的其他成員添加它們。所以大多數人的答案是「爲什麼我沒有想到這個標準呢?」是沒有人提出的。
添加'stoimax()'和'stoumax()'就足夠了;不需要對每個* [u] intN_t'類型的轉換函數。 –
@凱瑟湯普森:是嗎?那麼你將依賴於函數的所有用途,將函數的值變成一個大的'intmax'類型,檢查它是否在他們想要使用的變量的範圍內,並使用縮小轉換。或者,也許人們會放棄一個演員陣容,而不用考慮他們獲得的價值和字符串中的值是不同的......是的,我看到了這種情況,接着是SO中的問題,並抱怨C++有多複雜使用權利。 –
[說實話,可能藏在圖書館'stoi
- 1. 爲什麼這不是一個固定的寬度模式?
- 2. bash中固定寬度整數的寬度是多少?
- 3. C99的固定寬度整數類型
- 4. 爲什麼圖像不是以固定寬度的DIV爲中心?
- 5. 繪圖儀:什麼是固定的 - 高度或寬度
- 6. div寬度爲100%,旁邊是固定寬度的
- 7. 固定寬度
- 8. 固定寬度
- 9. 固定寬度
- 10. Modelsim中最易讀的固定寬度字體是什麼?
- 11. 爲什麼固定位置會改變元素的寬度?
- 12. 固定數據表的寬度不調整容器
- 13. 爲什麼不是頁腳100%寬度?
- 14. Gridview寬度不固定
- 15. 固定寬度整數是否分配乘法?
- 16. 自動調整已經固定寬度
- 17. 跨度的固定寬度?
- 18. 爲什麼固定寬度文件格式仍在使用中?
- 19. 爲什麼std :: stol不能用科學記數法工作?
- 20. fancybox2固定寬度
- 21. 固定寬度格
- 22. PDF.js固定寬度
- 23. 帶固定寬度列的表格 - 不指定表格寬度
- 24. 將JPEG圖像調整爲固定寬度,同時保持寬高比不變
- 25. 固定寬度的側邊欄在響應式設計不工作爲什麼?
- 26. Flexbox:爲什麼flex-grow不適用於固定寬度的同胞?
- 27. CSS固定寬度跨度
- 28. 固定的右菜單寬度爲100%
- 29. 使用非固定整數(int,long)而不是固定長度(int64_t,int32_t)有什麼好處?
- 30. 固定寬度div div寬度div?
這樣做的一個缺點就是沒有固定寬度的整數類型保證存在。所以你需要'sto_uint_least8_t()','sto_uint_fast8_t()'等 – Praetorian
@Praetorian一套'sto()'等並不是那麼糟糕。 –
你的問題的標題似乎暗示你寧願只對固定寬度的整數具有函數......這實際上是你的意思,還是你問爲什麼他們不存在? –