web-dev-qa-db-ja.com

なぜstd :: stouがないのですか?

C++ 11には、新しい文字列変換関数がいくつか追加されました。

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

Stoi(stringからint)、stol(stringからlong)、stoll(stringからlong long)、stoul(stringからunsigned long)、stoull(stringからunsigned long long)が含まれます。それがない場合に注目すべきは、stou(文字列から符号なし)関数です。必要ではないが、他のすべてが必要な理由はありますか?

関連: C++ 11には「sto {short、unsigned short}」関数はありませんか?

88
David Stone

最もパットな答えは、Cライブラリには対応する「strtou」がなく、C++ 11文字列関数はすべてCライブラリ関数の薄いベールラッパーであるということです。_std::sto*_関数のミラー_strto*_、および_std::to_string_関数はsprintfを使用します。


編集:KennyTMが指摘しているように、stoistolの両方は、基になる変換関数としてstrtolを使用しますが、stoulが存在するのに、なぜstrtoulを使用し、対応するstouはありません。

26
Kerrek SB

stoiは存在するがstouは存在しない理由はわかりませんが、stoulと架空のstouとの唯一の違いは、結果がunsignedの範囲:

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と似ていますが、範囲チェックが異なるだけです。しかし、既に存在するため、正確に実装する方法を心配する必要はありません。)

21
Mike Seymour