std::stoui のようなもの

C++11 では、文字列を整数に変換する関数として std::stoi, std::stol, std::stoll, std::stoul, std::stoull が追加されました。それぞれ std::string を int, long, long long, unsigned long, unsigned long long へ変換する関数です。

少し見ると分かることですが、int へ変換する関数はあるのに、unsigned int へ変換する関数は用意されていません。
int があるのだから、unsigned int も用意されていてもいいように思う所ですが、実は std::string を unsigned int へ変換する関数 stoui の実装は、std::stoul を使えばそれほど難しくはありません。
以下はその実装例です。
#include <iostream>
#include <limits>
#include <string>

unsigned int stoui(const std::string& str, std::size_t* pos=0, int base=10)
{
    try {
        unsigned long tmp = std::stoul(str, pos, base);

        // unsinged intの最大値をチェックする
        if (tmp > std::numeric_limits<unsigned int>::max()) {
            throw std::out_of_range("stoui");
        }

        return tmp;
    }
    catch (const std::invalid_argument& e) { // std::stoulからの例外
        throw std::invalid_argument("stoui");
    }
    catch (const std::out_of_range& e) { // std::stoulからの例外
        throw std::out_of_range("stoui");
    }
}


int main(void)
{
    unsigned int ui = stoui("123");
    std::cout << ui; // => "123"

    try {
        ui = stoui("abc");
    }
    catch (const std::invalid_argument& e) {
        std::cout << e.what(); // => "stoui"
    }

    try {
        ui = stoui("5000000000");
    }
    catch (const std::out_of_range& e) {
        std::cout << e.what(); // => "stoui"
    }

    return 0;
}

0 件のコメント:

コメントを投稿