2015-01-09 27 views
3

由於ints和longs以及其他整數類型可能在不同的系統上有不同的大小,爲什麼不能有stouint8_t(),stoint64_t()等,這樣可以將可移植的字符串轉換爲int代碼呢?爲什麼stoi,stol不是固定寬度的整數?

+3

這樣做的一個缺點就是沒有固定寬度的整數類型保證存在。所以你需要'sto_uint_least8_t()','sto_uint_fast8_t()'等 – Praetorian

+1

@Praetorian一套'sto ()'等並不是那麼糟糕。 –

+1

你的問題的標題似乎暗示你寧願只對固定寬度的整數具有函數......這實際上是你的意思,還是你問爲什麼他們不存在? –

回答

5

因爲它是通常沒有必要。分別返回long longunsigned long long的結果。如果要將字符串轉換爲int64_t,則只需撥打stoll()並將結果存儲在int64_t對象中;該值將被隱式轉換。

這假定long long是最寬的帶符號整數類型。與C一樣(從C99開始),C++允許擴展整數類型,其中一些可能比[unsigned] long long更寬。 C提供的轉換函數strtoimaxstrtoumax(分別在intmax_tuintmax_t上操作)在<inttypes.h>中。無論出於何種原因,C++沒有這個功能提供包裝(邏輯名稱是stoimaxstoumax

但是,這不會不管,除非您使用的是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"; 

} 
+0

C++也支持'intmax_t',但不提供'strtoimax'上的'std :: stoimax'包裝。 –

+0

正如固定大小的整數類型本身一樣必要。對不起,但我不能同意這種評估。 –

+3

即有時需要,有時不需要 –

7

因爲打字,這將使我想砍掉我的手指

嚴重的是,基本的整數類型是intlongstd::stoX功能都只是圍繞strtol等非常簡單的包裝,並注意C沒有提供strtoi32strtoi64或任何std::stouint32_t可以換。

如果你想要更復雜的東西,你可以自己寫。

我一樣好問「爲什麼人們使用intlong,而不是int32_tint64_t無處不在,因此代碼移植?」答案會是因爲它並不總是必要的。

但實際的原因可能是沒有人提出過這個標準。事情不只是神奇地出現在標準中,有人必須寫一份提案並說明添加它們的理由,並說服委員會的其他成員添加它們。所以大多數人的答案是「爲什麼我沒有想到這個標準呢?」是沒有人提出的。

+1

添加'stoimax()'和'stoumax()'就足夠了;不需要對每個* [u] intN_t'類型的轉換函數。 –

+0

@凱瑟湯普森:是嗎?那麼你將依賴於函數的所有用途,將函數的值變成一個大的'intmax'類型,檢查它是否在他們想要使用的變量的範圍內,並使用縮小轉換。或者,也許人們會放棄一個演員陣容,而不用考慮他們獲得的價值和字符串中的值是不同的......是的,我看到了這種情況,接着是SO中的問題,並抱怨C++有多複雜使用權利。 –

+0

[說實話,可能藏在圖書館'stoi (str,&endp)'後面的模板後面......但是如果你問我,爲什麼擴展它,'stoiX'的界面並不是那麼好?] –