2012-01-03 6 views
66

C++ 11は、いくつかの新しい文字列変換機能を追加しました:std :: stouがないのはなぜですか?

http://en.cppreference.com/w/cpp/string/basic_string/stoul

それはSTOI(INT文字列)、STOL(長に文字列)、ストール(長い長の文字列)、stoul(文字列にを含みますunsigned long)、stoull(文字列をunsigned long longにする)。不在時に注目すべきはstou(文字列から符号なし)関数です。それは必要ではない何らかの理由はありますか?他のすべては何ですか? stoiが存在する理由私はさっぱりだがNo "sto{short, unsigned short}" functions in C++11?

+0

他の質問が建設的でないのと同じ理由で、建設的ではありません。 –

+5

私の質問は、 "ただのstoulを使用することのいくつかの非明白な欠点があります"という行に沿っていることを意図していました。明らかにそれはテンプレートのインスタンス化を混乱させるでしょうが、私が考慮していないことがありますか?それがなぜ除外されたのかについてのコメントは素晴らしいものですが、二次的です。 –

+9

@ NicolBolasなぜこれが建設的ではないのか分かりません。私はこの矛盾の理由を見ることができないので、完全に有効な質問です。アンワースは、既存の有効な可能性について洞察を与えるかもしれませんが、その明らかな理由はありません。 –

答えて

20

最もパットの答えはCライブラリは一切対応“ strtou ”を持っていない、とC++ 11文字列関数は、すべてのCライブラリ関数の周りだけで薄くベールに包まれたラッパーであることを次のようになります。std::sto*機能がstrto*を反映し、std::to_string関数はsprintfを使用します。


編集:KennyTMが指摘するように、基礎となる変換機能の両方stoistol使用strtolが、strtoulを使用stoulが存在している間、該当するstouが存在しない理由はまだ謎のです。

+10

C++委員会がなぜこのようなC-ishアプローチをとることにしたのか知っていますか? 'boost :: lexical_cast <>()'のようなものは、C++のやり方のように思えます。 –

+2

これらの実装の詳細は実際には標準で定義されていますか? –

+0

@LightnessRacesinOrbit:はい、そうです。 –

18

なくstouが、結果はunsignedの範囲内であることをstoulと仮想のstouの唯一の違いは、チェック次のようになります:

関連

unsigned stou(std::string const & str, size_t * idx = 0, int base = 10) { 
    unsigned long result = std::stoul(str, idx, base); 
    if (result > std::numeric_limits<unsigned>::max()) { 
     throw std::out_of_range("stou"); 
    } 
    return result; 
} 

(同様に、stoistolと似ていますが、異なる範囲チェックを使用していますが、すでに存在しているため、実装方法を正確に心配する必要はありません)

+0

'sti'と' stol'、 'stol'と' stoll'の違いは範囲チェックだけです。 – Hossein

+1

@Hossein: 'stoi'と' stol'の間にあります。しかし、 'stol'と' stoll'は範囲チェックの点で違いはなく、異なるライブラリ関数を呼びます。 –

関連する問題