少し見ると分かることですが、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 件のコメント:
コメントを投稿